【问题标题】:Web API OData function with TimeSpan具有 TimeSpan 的 Web API OData 函数
【发布时间】:2016-12-02 03:13:09
【问题描述】:

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

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

我们将不胜感激。

【问题讨论】:

    标签: c# .net asp.net-web-api2 odata


    【解决方案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 的实现似乎不接受大于天的周期性类型。 P1WP1MP1Y 都被拒绝了。

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 2014-10-08
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2015-02-06
      • 2011-10-08
      • 2015-09-04
      相关资源
      最近更新 更多