2016-12-02 103 views
1

我有一個創建的Web API OData v4服務。我試圖創建一個約束函數具有在OData的控制器定義簽名類似於下面的時間跨度參數:TimeSpan的Web API 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"); 

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

它在下面的OData的模型構建器配置

運行時,模型似乎已正確創建,元數據描述顯示「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') 

這就是說,微軟的實現似乎並不接受定期種比天更大。 P1W,P1MP1Y都被拒絕。