Skip to main content
 首页 » 编程设计

c#之具有 TimeSpan 的 Web API OData 函数

2024年04月12日36lyhabc

我有一个我创建的 Web API OData v4 服务。我正在尝试创建一个具有 TimeSpan 参数的绑定(bind)函数,该参数具有在 OData Controller 中定义的签名,类似于以下内容:

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

如有任何帮助,我们将不胜感激。

请您参考如下方法:

我找到了原因。 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 均被拒绝。