如何将 UTC 日期传递给 Web API?
传递2010-01-01
工作正常,但是当我传递UTC日期时,例如2014-12-31T22:00:00.000Z
(带有时间组件) ),我收到 HTTP 404 响应。所以
http://domain/api/controller/action/2012-12-31T22:00:00.000Z
产生 404 错误响应,而
http://domain/api/controller/action/2012-12-31
工作正常。
然后如何将 UTC 日期传递给 Web API - 或者至少指定日期和时间?
最佳答案
问题是双重的:
1。 .
在 route
默认情况下,IIS 将所有带点的 URI 视为静态资源,尝试返回它并完全跳过进一步处理(通过 Web API)。这是在 Web.config 的 system.webServer.handlers
部分中配置的。 :默认处理程序句柄 path="*."
。您不会在这个 path
中找到太多关于奇怪语法的文档。属性(正则表达式会更有意义),但这显然意味着“任何不包含点的内容”(以及下面第 2 点中的任何字符)。因此名称中的“Extensionless”ExtensionlessUrlHandler-Integrated-4.0
.
在我看来,按照“正确性”的顺序,可以有多种解决方案:
- 专门为必须允许点的路由添加一个新处理程序。请务必将其添加到默认值之前。为此,请确保先删除默认处理程序,然后将其添加回您的默认处理程序之后。
- 更改
path="*."
属性为path="*"
。然后它会捕获所有内容。请注意,从那时起,您的 Web api 将不再将带点的来电解释为静态资源!如果您在 Web API 上托管静态资源,则不建议这样做! - 将以下内容添加到您的 Web.config 以无条件处理所有请求:在
<system.webserver>
下:<modules runAllManagedModulesForAllRequests="true">
2。 :
在 route
更改上述内容后,默认情况下,您会收到以下错误:
A potentially dangerous Request.Path value was detected from the client (:).
您可以更改 Web.config 中预定义的禁止/无效字符。下<system.web>
,添加以下内容:<httpRuntime requestPathInvalidCharacters="<,>,%,&,*,\,?" />
。我已经删除了:
来自无效字符的标准列表。
更简单/更安全的解决方案
虽然这不是您问题的答案,但更安全、更简单的解决方案是更改请求,以便不需要所有这些。这可以通过两种方式完成:
- 将日期作为查询字符串参数传递,例如
?date=2012-12-31T22:00:00.000Z
. - 删除
.000
来自每个请求,并对 url 进行编码,因此替换所有:
与%3A
,例如通过使用HttpUtility.UrlEncode()
.
关于asp.net - 如何传递日期时间参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14359566/