значение изменяется при отправке данных через Https - PullRequest
0 голосов
/ 20 ноября 2018

В ASP.NET WebApi: у меня есть класс DTO:

public class DTO
{
    public string Date {get; set;}
}

, когда клиент (плагин Internet Explorer) запрашивает данные из этого WebApi, я возвращаю IEnumerable<DTO> следующим образом:

return Request.CreateResponse(System.Net.HttpStatusCode.OK, dtoObject)

Где dtoObject имеет тип IEnumerable<DTO>.Во время отладки я проверяю значение dtoObject[0].Date, и оно показывает 22-Nov-18 12:00:00 AM, и это ожидаемое значение.

В плагине Internet Explorer: у меня есть класс модели с именем Model:

public class Model
{
    public string Date {get; set;}
}

Я запрашиваю WebApi Вот так:

var response = await httpClient.PostAsJsonAsync(serviceUrl, requestDto);
var returnJson = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<IEnumerable<Model>>(returnJson)

Теперь, когда я проверяю result[0].Date Я получаю 12/11/2018 12:00:00 AM, пока я ожидаю 22-Nov-18 12:00:00 AM

IЯ прочитал, что значения даты по-разному сериализуются разными библиотеками / языками. Но я использую string для хранения значения, тогда почему значение меняется?Я хочу получить значение Date в формате dd-MMM-yy hh:mm:ss tt.Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Указанная проблема не может быть воспроизведена в следующих тестах.

Модульный тест, который сериализует DTO, а затем десериализует Model, ведет себя как ожидалось

[Test]
public void __String_Dates_Should_Match() {
    //Arrange
    var date = "22-Nov-18 12:00:00 AM";
    var dtoObject = new[] { new DTO { Date = date } };
    var returnJson = JsonConvert.SerializeObject(dtoObject);

    //Act
    var result = JsonConvert.DeserializeObject<IEnumerable<Model>>(returnJson);

    //Assert
    result.First()
        .Should().NotBeNull()
        .And.Match<Model>(_ => _.Date == date);
}

Интеграционный тест с использованием веб-API в памяти также ведет себя как ожидалось

[TestClass]
public class MyTestClass {
    [Test]
    public async Task __WebApi_Dates_Should_Match() {
        //Arrange
        var date = "22-Nov-18 12:00:00 AM";
        var config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();
        var httpServer = new HttpServer(config);
        var client = new HttpClient(httpServer);

        //Act
        var response = await client.GetAsync("http://localhost/api/test/data");
        var returnJson = await response.Content.ReadAsStringAsync();

        //Assert
        response.IsSuccessStatusCode.Should().BeTrue();

        var result = JsonConvert.DeserializeObject<IEnumerable<Model>>(returnJson);
        result.First()
            .Should().NotBeNull()
            .And.Match<Model>(_ => _.Date == date);
    }
}

[RoutePrefix("api/test")]
public class TestApiController : ApiController {
    [HttpGet]
    [Route("data")]
    public IHttpActionResult Get() {
        var date = "22-Nov-18 12:00:00 AM";
        var dtoObject = new[] { new DTO { Date = date } };
        return Ok(dtoObject);
    }
}

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

В этом случае проблема будеткак вы назначаете DateTime свойствам.Это может быть результатом текущей культуры, в которой выполняется код.

var value = new DTO { 
    Date = someDateTime.ToString()
};

, где должен применяться желаемый формат даты

var value = new DTO { 
    Date = someDateTime.ToString("dd-MMM-yyyy hh:mm:ss tt")
};
0 голосов
/ 20 ноября 2018

Попробуйте использовать формататор ISO-8601 DateTime в конфигурации WebAPI для согласованного формата даты:

JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new IsoDateTimeConverter());
GlobalConfiguration.Configuration.Formatters[0] = new JsonNetFormatter(serializerSettings);

Даты будут возвращены как:

{
   "Date": "2018-11-20T12:16:00"
}

В вашем клиенте вам нужноожидать того же формата при десериализации JSON для вашего внутреннего объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...