我在查询字符串中发送 UTC 日期,例如
&结束日期=2000-01-02T03%3a04%3a05.0060000Z
我的控制器参数将其绑定在一个复杂的对象中,例如
public async Task<DocumentsRequest> GetEchoFromUriDocumentsAsync(
[FromUri] DocumentsRequest request)
{
return request;
}
我设法弄清楚的是,参数绑定后我的对象将我的 UTC 日期更改为本地日期 + 偏移量。这是我的测试用例的片段
[TestMethod]
public void Should_generate_querystring_and_parameter_bind_correctly()
{
DocumentsRequest request = DocumentRequestBuilder.DocumentsRequest();
string queryString = ReflectionQueryStringConverter.ToQueryString(request);
string baseUrl = "http://baseUrl/Test/EchoFromUriDocuments";
string uri = baseUrl + queryString;
HttpResponseMessage response = _client.GetAsync(uri).Result;
string outputString = response.Content.ReadAsStringAsync().Result;
JsonSerializer<DocumentsRequest> serializer =
new JsonSerializer<DocumentsRequest>();
DocumentsRequest output = serializer.DeserializeFromString(outputString);
output.EndDate.Should().Be(request.EndDate);
}
上面的操作失败了,因为输出是:
2000-01-01T19:04:05.006-08:00
但是,json 序列化然后截断偏移量并假设它是 UTC 日期...正如您所看到的,日期与往返后不匹配。
这里有一个类似的问题,但不是真正的答案(发帖人回答的是自己的问题)
将 UTC 日期时间传递给 Web API HttpGet 方法会导致本地时间 https://stackoverflow.com/questions/22581138/passing-utc-datetime-to-web-api-httpget-method-results-in-local-time
解决此问题的正确解决方案是什么?我认为问题是我希望参数绑定将查询字符串解析为 UTC 日期。 TypeConverter 是正确的选择吗?有人有如何做到这一点的完整示例吗?我是否必须在具有 DateTime 的所有类的所有属性上使用 TypeConverter?我希望有某种全局配置。
Thanks.
我通过使用 DateTimeOffset 类而不是 DateTime 解决了类似的问题。请看这个答案:
日期时间与日期时间偏移 https://stackoverflow.com/questions/4331189/datetime-vs-datetimeoffset
DateTimeOffset 类在附加字段中存储您的时区信息。因此,您应该更改数据模型类 DocumentsRequest 并使用 DateTimeOffset。
接下来,您应该将 WebAPI 格式化程序与浏览器同步。我使用 Newtonsoft.Json 库并进行以下设置:
var jsonSettings = new JsonSerializerSettings
{
// Note the ISO format
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DefaultValueHandling = DefaultValueHandling.Include,
TypeNameHandling = TypeNameHandling.Auto
}
我在 WebAPI 注册类中注册了此设置:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
...
config.Formatters.Remove(config.Formatters.XmlFormatter);
config.Formatters.JsonFormatter.SerializerSettings = jsonSettings;
}
}
并且,在浏览器端使用 ISO 日期时间格式:
WWW 中的 ISO 日期时间格式 http://www.w3.org/TR/NOTE-datetime
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)