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

时间:2018-11-20 08:07:50

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

在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值。我该如何实现?

2 个答案:

答案 0 :(得分:3)

在以下测试中无法重现所陈述的问题。

先对Show More进行序列化然后对DTO进行反序列化的单元测试的行为符合预期

Model

使用内存内Web API的集成测试也可以达到预期的效果

[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);
}

鉴于分配的属性是字符串,因此日期转换不会影响它们。

然后的问题是如何将[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()
};

答案 1 :(得分:0)

尝试在WebAPI配置中使用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反序列化为内部对象时,您需要期望使用相同的格式。