通过Https发送数据时值会发生变化

问题描述 投票:0回答:2

在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

我已经读过,不同的库/语言对日期值进行了不同的序列化。但是,我使用string存储值,那么为什么值会发生变化?我希望以Date格式接收dd-MMM-yy hh:mm:ss tt值。我如何实现这一目标?

c# json asp.net-web-api json.net
2个回答
3
投票

所述问题无法在以下测试中复制。

序列化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);
}

使用内存中Web 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
投票

尝试在Web API配置中使用ISO-8601 DateTime格式以获得一致的日期格式:

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

日期将返回为:

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

在您的客户端中,在将JSON反序列化为内部对象时,需要使用相同的格式。

© www.soinside.com 2019 - 2024. All rights reserved.