【问题标题】:ASP.Net API DateTime ISO8601 date value being parsed as default date (01/01/0001 00:00:00) in production & AzureASP.Net API DateTime ISO8601 日期值在生产和 Azure 中被解析为默认日期 (01/01/0001 00:00:00)
【发布时间】:2020-12-04 10:16:26
【问题描述】:

当我们的 API 解析帖子值时,我发现了一个问题。这似乎只发生在实时环境中,因此在测试期间被遗漏了。

该类表示发布到 API 的内容:

public class LoginHistorySearch
{
    public DateTime StartDateUtc { get; set; }
    public DateTime EndDateUtc { get; set; }
}

切入核心问题,这里是作为响应返回的解析日期:

[Authorize]
[Route("Reports/LoginsByPeriod")]
public class LoginsController : ApiController
{

    public HttpResponseMessage Post([FromBody] LoginHistorySearch search) {
        return Request.CreateErrorResponse(HttpStatusCode.OK, search.StartDateUtc.ToString());
    }
}

如果我发布这些数据(目前使用 APITester.com):

{
"StartDateUtc": "2018-01-01T00:00:00Z",
"EndDateUtc": "2020-01-01T00:00:00Z"
}

我得到这个返回:

Response Body
{"Message":"01/01/0001 00:00:00"}

更奇怪的是,如果我使用 Postman 发帖,我会看到 IIS 404 错误。 谁能解释一下?

更新

  1. 发布到 Azure 应用服务 - 看到相同的结果
  2. Windows Server 使用 en-GB 语言环境(英国)
  3. 将 DateTime.Kind 添加到类中的 setter 以强制执行 UTC

【问题讨论】:

  • 您使用任何自定义模型绑定器吗?当CurrentCulture 不正确时,我过去曾看到过类似的问题,因此可能值得检查生产系统的语言环境。
  • 不是故意的。你能告诉我如何检查这个吗?我认为 ISO8601 格式无论如何都会克服任何文化设置?

标签: c# asp.net asp.net-web-api


【解决方案1】:

在仔细检查每个设置后,发现 Content-Type 标头在为实时站点创建 POST 时被丢弃。

手动添加它会产生所需的输出并触发正确的解析:

Content-Type : application/json

(血压恢复正常率)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2022-07-25
    相关资源
    最近更新 更多