如何将DateTimeOffset参数传递给oData函数

时间:2016-01-12 23:02:01

标签: .net function odata asp.net-web-api2 datetimeoffset

我有一个名为GetForPeriod的odata函数定义为:

        var getForPeriod =
            builder.EntityType<EventModel>()
                .Collection
                .Function("GetForPeriod")
                .ReturnsCollection<EventModelSummary>();
        getForPeriod.Parameter<DateTimeOffset>("from");
        getForPeriod.Parameter<DateTimeOffset>("to");

因此,为了从函数中获得结果,我需要调用:

http://localhost:17257/odata/Events/Default.GetForPeriod(from=2015-12-27T00:00:00-06:00,to=2016-02-06T00:00:00-06:00)

但我不断收到错误声明:

  

从客户端(:)检测到潜在危险的Request.Path值。

问题是日期,就像我一样 http://localhost:17257/odata/Events/Default.GetForPeriod(from=null,to=null) 我收到一个错误,指出它无法将null转换为DateTimeOffset(这是有意义的)。

我尝试将from和两个值中的冒号(:)替换为%3A ,但我仍然遇到相同的危险路径错误。

有趣的是,如果我使用日期过滤器调用事件的读取路径,它可以正常工作。 http://localhost:17257/odata/Events?$filter=ScheduledDate%20ge%202015-12-27T00:00:00-06:00%20and%20ScheduledDate%20le%202016-02-06T00:00:00-06:00

我应该如何调用OData函数来获取参数的日期时间偏移量?

3 个答案:

答案 0 :(得分:3)

请您尝试使用函数参数别名吗?

来自OData规范:

可以使用参数别名代替函数调用的内联参数。使用参数别名的名称将别名的值指定为单独的查询选项。

示例76:通过函数import EmployeesByManager调用Sales.EmployeesByManager函数,为ManagerID参数传递3

http://host/service/EmployeesByManager(ManagerID=@p1)?@p1=3

https://github.com/OData/WebApi/issues/204

上跟踪同一问题

感谢。

答案 1 :(得分:0)

将其添加到您的web.config文件中。

<system.web>
    <httpRuntime requestPathInvalidCharacters="%" />
</system.web>

答案 2 :(得分:0)

我必须创建一个包含以下内容的web.config文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering allowDoubleEscaping="true"/>
    </security>
  </system.webServer>
</configuration>