Параметры запроса HTTP в UTC в AspNet Core - PullRequest
0 голосов
/ 09 июня 2018

У меня проблема, с которой я не могу разобраться.

Я пытаюсь ВСЕГДА работать с UTC DateTime на стороне сервера.

У меня есть приложение AspNetCore Mvc с конечной точкой, которая принимаетзапросы, которые могут включать DateTimes.Я хочу, чтобы Mvc понял, что эти даты уже в UTC, и не преобразует их «снова».

Моя система находится в Испании, (UTC +2)

Если я отправлю запрос httpна мой локальный сервер вот так:

http://localhost:50004/api/Resources?appliesOn=2018-06-30T18:00:00.000Z

Я хочу иметь десериализованную дату и время в формате UTC, представляющую ту же дату, что и:

DateTime.SpecifyKind(new DateTime(2018, 6, 30, 18, 0, 0), DateTimeKind.Utc)

Но я вижу, что Mvc всегда преобразует дату2018-06-30T18: 00: 00.000Z через два часа: 2018-06-30 20: 00: 00

Я пытался указать Mvc использовать сериализатор / десериализатор UTC json, но ничего не изменилось:

services
  .AddMvc()
  .AddJsonOptions(options =>
  {
      options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
  });

Есть ли способ отправить параметры запроса в запросе HTTP GET уже в виде представления времени и времени UTC?Я понял дату в ISO 8601, если он имеет суффикс Z, это означает «смещение нуля», которое должно интерпретироваться уже как время в формате UTC.Почему Mvc затем преобразует это и добавляет смещение на 2 часа?

Любые разъяснения будут высоко оценены!

PS: Это моя конечная точка, ничего особенного, как вы можете видеть:

[HttpGet("")]
public IActionResult GetResources()
{
    var displayUri = Request.GetDisplayUrl();
    var requestUri = new Uri(displayUri);
    var filter = _filteredRequestFactory.Create(requestUri);
    var resources = _myProjection.GetResourcers(filter);
    return Ok(resources);
}

1 Ответ

0 голосов
/ 11 июня 2018

Благодаря еще один вопрос в StackOverflow Я выяснил, что причина этого заключается в том, что десериализатор AspNetCore Mvc даже не использует десериализатор Json.Net в запросе GET http для десериализации параметров запроса.

Следовательно, моя конечная точка будет перехватывать следующий запрос: http://localhost:50004/api/DateTests?date=2018-06-15T18:00:00.000Z

:

[HttpGet("")]
public IActionResult GetDate(DateTime date)
{
    return Ok(date.ToString("o"));
}

и возвращать дату в формате ISO 8601 следующим образом: 2018-06-15T20:00:00.0000000+02:00

Он десериализует параметр запроса, как если бы это была дата по местному времени, и применяет UTC + 2 (потому что приложение находится в Испании).

Мне нужен был способ сообщить десериализатору AspNet Core Mvcчтобы понять, что параметр запроса, который выглядит как дата, следует рассматривать уже как дату UTC, а не изменять его при десериализации.

Ответ заключался в создании пользовательского связывателя модели и применении его либо к этой конечной точке, либоглобально.

Я нашел хорошую реализацию , и после добавления этого поставщика связывателя модели и связывателя модели

моя конечная точка теперь возвращается для запроса с ?date=2018-06-15T18:00:00.000Z:

2018-06-15T18:00:00.0000000 как DateTime типа UTC.

Если я передам ?date=2018-06-11T18:00:00+0100, он будет получен как местное времявид и результат будет: 2018-06-11T19:00:00.0000000+02:00

по желанию

...