C# 通过Https发送数据时,值会更改
在ASP.NET WebApi中: 我有一门DTO课程: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。 调试
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
类型的变量中?我无法更改全局设置。有没有办法在当地做这件事。