当通过正文中的 HTTP-POST 和通过 HTTP-GET 作为查询参数传递时,DateTime 的解析不同

DateTime parses differently when passed via HTTP-POST in body and via HTTP-GET as query params

在我们的 MVC 3 Web 应用程序中,我们使用当前用户的首选项定义 Thread.CurrentThread.CurrentCulture。但是,在一个视图中,我们始终以 mm/dd/yyyy 格式通过 Ajax 提交数据,只要用户的文化是 en_US,这就可以正常工作。 (显然)

令人惊讶的是,当我们将它作为 HTTP-POST 传递时,它对所有用户都有效,但当我们将它作为 HTTP-GET 传递时它就停止工作了。 (在这两种情况下,离开浏览器的值完全相同)。

知道为什么 HTTP-POST 调用的处理方式与 HTTP-GET 不同吗?

此外,该操作还有其他参数。在 HTTP-POST 的情况下,它们都在正文中设置为:

{
  "date": "04/15/2016",
  "someText": "Hello World",
  "someNumber": 42
}

对于 HTTP-GET,它们是查询参数:

domain.tld/controller/action?date=04%2F15%2F2016&someText=Hello+World&someNumber=42

更新:

为避免混淆,该方法被正确调用并且 returns 两种情况下的值。只是 DateTime 参数(实际上是 DateTime?)没有被设置,就像我将它设置为一些无效的日期/字符串一样。

请检查您的请求处理程序是否为 GET or POST,如果设置为 POST,则无法处理 GET 请求。

编辑 **忽略下面一个**:因为URL两种方法的编码相同

"The only difference that in GET request is all the special characters will be encoded for. ex / to %2f where in POST it wont happen."

Any ideas why HTTP-POST calls would be handled differently than HTTP-GET?

默认模型活页夹根据 HTTPVERB 使用以下区域性

  • 用于 HTTPGET 的 InvariantCulture
  • 您的 HTTPPOST 请求的 CurrentCulture。

这是因为用户会与来自不同文化背景的其他用户分享他们的 URLS (HTTPGET)。

假设我们有一位来自美国的用户想要向他们在英国的朋友发送 URL 关于 2016 年 4 月 15 日发生的事件。 (2016 年 4 月 15 日)。他们给他们的朋友以下 URL...

http://www.myurl.com/tickets/?eventdate=04%2F15%2F2016

如果我们不使用不变文化,那么这个日期对我们在英国的朋友将无效,因为他们的文化要求 dd/mm/yyyy。

关于 HTTPPOST,用户通常不会与其他用户共享这些类型的请求,因为它们通常是针对每个用户生成的。因此我们可以明确地使用 CurrentCulture.

您可以通过创建自己的模型活页夹来覆盖此默认行为。

希望对您有所帮助!