C# 通过Https发送数据时,值会更改

C# 通过Https发送数据时,值会更改,c#,json,asp.net-web-api,json.net,C#,Json,Asp.net Web Api,Json.net,在ASP.NET WebApi中: 我有一门DTO课程: public class DTO { public string Date {get; set;} } 当客户端(Internet Explorer插件)从这个WebApi请求数据时,我返回IEnumerable,如下所示: return Request.CreateResponse(System.Net.HttpStatusCode.OK, dtoObject) 其中,dtoObject的类型为IEnumerable。 调试

在ASP.NET WebApi中: 我有一门DTO课程:

public class DTO
{
    public string Date {get; set;}
}
当客户端(Internet Explorer插件)从这个WebApi请求数据时,我返回
IEnumerable
,如下所示:

return Request.CreateResponse(System.Net.HttpStatusCode.OK, dtoObject)
其中,
dtoObject
的类型为
IEnumerable
。 调试时,我检查
dtoObject[0].Date的值,它显示
2018年11月22日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)
var response=wait-httpClient.PostAsJsonAsync(serviceUrl,requestDto);
var returnJson=await response.Content.ReadAsStringAsync();
var result=JsonConvert.DeserializeObject(returnJson)
现在,当我检查
结果[0]时,日期
我得到,
2018年11月12日上午12:00:00
当我期待着2018年11月22日12:00:00时


我曾读到,不同的库/语言对日期值进行了不同的序列化。。但是,我使用
字符串
来存储值,那么为什么要更改值呢?我想以
dd-MMM-yy-hh:mm:ss-tt
格式接收
Date
值。如何实现这一点?

尝试在WebAPI配置中使用ISO-8601日期时间格式化程序以获得一致的日期格式:

JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new IsoDateTimeConverter());
GlobalConfiguration.Configuration.Formatters[0] = new JsonNetFormatter(serializerSettings);
然后,日期将返回为:

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

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

尝试在WebAPI配置中使用ISO-8601日期时间格式化程序以获得一致的日期格式:

JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new IsoDateTimeConverter());
GlobalConfiguration.Configuration.Formatters[0] = new JsonNetFormatter(serializerSettings);
然后,日期将返回为:

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

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

在以下测试中无法再现所述问题

DTO
序列化,然后将
模型
反序列化的单元测试的行为符合预期

[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);
    }
}
应该在哪个位置应用所需的日期格式

var value = new DTO { 
    Date = someDateTime.ToString("dd-MMM-yyyy hh:mm:ss tt")
};

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

DTO
序列化,然后将
模型
反序列化的单元测试的行为符合预期

[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);
    }
}
应该在哪个位置应用所需的日期格式

var value = new DTO { 
    Date = someDateTime.ToString("dd-MMM-yyyy hh:mm:ss tt")
};

您确实应该包含足够的代码,以便我们读者能够重现结果。这个问题可能有很多方面。区域性覆盖,格式覆盖。实际上,您只需要创建entity.DateTimeProperty.ToString(“mm/dd/yyyy”)。也可能是另一个宿主只是将数据配置为这种格式,而您现在必须解析您这边的数据。包含日期的字符串在通过JSON传输时不会更改其格式。这是你的显示逻辑,我没有显示逻辑。我调试我的插件并查看
entity.date
,我得到
“07/11/2018 12:00:00 AM”
是否值得使用反序列化日期格式化程序?见@Foy的答案。与Rebecca在下面这个问题中的回答相同,但它是局部的,而不是全局的。您能否请您的问题共享字符串
returnJson
?您确实应该包含足够的代码,以便我们读者能够重现结果。这个问题可能有很多方面。区域性覆盖,格式覆盖。实际上,您只需要创建entity.DateTimeProperty.ToString(“mm/dd/yyyy”)。也可能是另一个宿主只是将数据配置为这种格式,而您现在必须解析您这边的数据。包含日期的字符串在通过JSON传输时不会更改其格式。这是你的显示逻辑,我没有显示逻辑。我调试我的插件并查看
entity.date
,我得到
“07/11/2018 12:00:00 AM”
是否值得使用反序列化日期格式化程序?见@Foy的答案。与Rebecca在下面这个问题中的回答相同,但它是本地的,而不是全局的。请您将您的问题共享字符串
returnJson
?我找不到
JsonNetFormatter
。我需要为这个类添加任何引用吗?顺便说一句,在序列化/反序列化时,该值是否可能更改,即使它存储在
string
类型的变量中?我无法更改全局设置。是否有任何方法在本地执行此操作。我找不到
JsonNetFormatter
。我需要为这个类添加任何引用吗?顺便说一句,在序列化/反序列化时,该值是否可能更改,即使它存储在
string
类型的变量中?我无法更改全局设置。有没有办法在当地做这件事。