2016-12-02 2 views
1

У меня есть служба API OData v4, которую я создал. Я пытаюсь создать связанную функцию, которая имеет параметр TimeSpan, имеющий подпись, определенную в контроллере OData, аналогичный приведенному ниже:Функция веб-API OData с TimeSpan

public IQueryable<ProductionRecordDTO> GetProduction(
     [FromODataUri]DateTimeOffset startDate, 
     [FromODataUri]DateTimeOffset endDate, 
     [FromODataUri]TimeSpan sampleInterval) 

Он выполнен в модели строитель OData, как показано ниже:

var getProduction = builder.EntitySet<ProductDTO>("Products").EntityType.Collection.Function("GetProduction"); 
     getProduction.Namespace = "ProductsService"; 
     getProduction.ReturnsCollection<ProductionRecordDTO>(); 
     getProduction.Parameter<DateTimeOffset>("StartDate"); 
     getProduction.Parameter<DateTimeOffset>("EndDate"); 
     getProduction.Parameter<TimeSpan>("SampleInterval"); 

При запуске модель, по-видимому, правильно создана, описание метаданных показывает, что «SampleInterval» правильно определено как тип Edm.Duration.

При попытке вызвать этот метод, однако с URL, такие как:

http://dev-pc/odata/Products/ProductsService.GetProduction(StartDate=2014-01-01T00:00:00Z, EndDate=2017-01-01T00:00:00Z, SampleInterval=P1Y) 

ODataException отбрасывается с сообщением «SampleInterval = P1Y» не в области. То же самое верно для каждого варианта изменения формата ISO 8601, который я им даю.

Использование:

  • Microsoft.OData.Core - v6.15.0
  • Microsoft.AspNet.OData - v5.9.1

Любая помощь, оказываемая было бы весьма признателен.

ответ

1

Я нашел причину. Параметры Edm.Duration, по-видимому, не могут быть интерпретированы литерально и должны иметь тип, обернутый вокруг них, например. duration'P1D' В этом случае правильный вызов был бы:

http://dev-pc/odata/Products/ProductsService.GetProduction(StartDate=2014-01-01T00:00:00Z, EndDate=2017-01-01T00:00:00Z, SampleInterval=duration'P1D') 

Тем не менее, реализация Microsoft, кажется, не принимает периодических видов больше, чем дней. P1W, P1M и P1Y все отклоняются.