【问题标题】:.NET WebApi Inconsistent DateTime Kind POST vs GET.NET WebApi 不一致的日期时间类型 POST 与 GET
【发布时间】:2023-03-17 06:47:02
【问题描述】:

当我通过 GET 请求从 AngularJS 向我的 WebApi 控制器发出 JSON 调用时,我的日期以“本地”类型传递给我的模型。这很好,我希望它如何工作。

但是,当我将方法更改为 POST(在 WebApi 控制器和我的 AngularJS 客户端代码上)时,日期是一个小时,因为 DateTime 类型现在是 UTC。日期在发送之前通过 .toJSON() 进行序列化,并且在查看 GET 和 POST 请求时,通过 Chrome 的网络检查,一切看起来都一样。

如何在 POST 和 GET 请求中保持 DateTime 类型的一致性,以便它们始终是本地的?

编辑#1:

Angular JS 调用:

            var params = {
                DateFrom: detail.from.toJSON(),
                DateTo: detail.to.toJSON(),
                Filters: detail.filters
            };

            return http.post(window.urls.apiGetAllErrorsGraphData, params);

在我当前的示例中,params.DateFrom = "2014-04-30T23:00:00.000Z", detail.from = 01/05/2014 作为 JS Date 对象的值。

在这种情况下,'http.post' 是我编写的一个 Angular 服务,它基本上包装了 HTTP 调用。

.NET WebAPI 控制器

    [POST("api/errors/chart")]
    [HttpPost]
    [HttpOptions]
    public IHttpActionResult GetAllErrorsGraphData([FromBody]AllErrorChartDetails details)
    {
        var results = chartDataService.GenerateAllErrorsData(details.DateFrom, details.DateTo, details.Filters);

        return Ok(results.Select(x => new { date = x.Key, errors = x.Value }));
    }

如果您对方法的属性感到好奇,我正在使用 AttributeRouting。

【问题讨论】:

  • 能出示相关代码吗?
  • 更新了原帖。
  • 我猜这是您在 GET 请求中的日期格式。你能发布你的代码吗?
  • 它和上面的一样,除了它说 POST 它会说 GET,并且控制器会有 [FromUri]。
  • 你使用的是什么 JSON 序列化器?

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


【解决方案1】:

您能否在检索到 DateTime 对象时将其转换为您需要的任何格式?

DateTime json = yourJsonMethod();
json = json.ToLocalTime();

【讨论】:

  • 我可以猜到,但这有点老套,你不觉得吗?我必须在我需要将方法从 GET 转换为 POST 的所有方法中执行此操作或类似操作。
  • Hacky 并不总是一件坏事 :-) 尽管如果您有多种使用此代码的方法,它可能会很麻烦。也可以内联:details.DateFrom.ToLocalTime();See here;看起来可能还有一种方法可以使转换“透明”,所以也许您不需要每次都使用该方法......(参见 Sean Fausett 的回答)
  • 我似乎无法让 Sean Fausett 的解决方案为我工作,日期一直以 Utc 的形式出现。我不禁觉得这是框架中的一个错误,我看不出您为什么希望 DateTime Kind 在各种 HTTP 方法之间有所不同。
猜你喜欢
  • 2018-01-02
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多