我收到了这条 ServiceStack 小消息:
[Route("/server/time", "GET")]
public class ServerTime : IReturn<ServerTime>
{
public DateTimeOffset DateTime { get; set; }
public TimeZoneInfo TimeZone { get; set; }
}
其各自的服务处理程序如下:
public object Get(ServerTime request)
{
return new ServerTime
{
DateTime = DateTimeOffset.Now,
TimeZone = TimeZoneInfo.Local,
};
}
客户端测试代码如下所示:
var client = new JsonServiceClient("http://localhost:54146/");
var response = client.Get<ServerTime>(new ServerTime());
但是 response.TimeZoneInfo 总是空的......
服务的元数据(JSON)也没有显示它:
(JSON 元数据页面中的示例请求)
POST /json/reply/ServerTime HTTP/1.1
Host: localhost
Content-Type: application/json
Content-Length: length
{"DateTime":"\/Date(-62135596800000)\/"}
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: length
{"DateTime":"\/Date(-62135596800000)\/"}
另一方面,XML 和 CSV 格式似乎可以正确处理它:
POST /xml/reply/ServerTime HTTP/1.1
Host: localhost
Content-Type: application/xml
Content-Length: length
<ServerTime xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/PtsSampleService.ServiceModel">
<DateTime xmlns:d2p1="http://schemas.datacontract.org/2004/07/System">
<d2p1:DateTime>0001-01-01T00:00:00Z</d2p1:DateTime>
<d2p1:OffsetMinutes>0</d2p1:OffsetMinutes>
</DateTime>
<TimeZone xmlns:d2p1="http://schemas.datacontract.org/2004/07/System" i:nil="true" />
</ServerTime>
HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: length
<ServerTime xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/PtsSampleService.ServiceModel">
<DateTime xmlns:d2p1="http://schemas.datacontract.org/2004/07/System">
<d2p1:DateTime>0001-01-01T00:00:00Z</d2p1:DateTime>
<d2p1:OffsetMinutes>0</d2p1:OffsetMinutes>
</DateTime>
<TimeZone xmlns:d2p1="http://schemas.datacontract.org/2004/07/System" i:nil="true" />
</ServerTime>
为什么我要问这个而不是使用“XML 客户端”?
这都是关于一致性的。如果 API 在所有可能的客户端上不一致,那么就不能依赖它!我将不得不删除 JSON 格式化程序(我不能这样做,因为我想在 JavaScript 中使用它)或者我必须单独拆分许多 TimeZoneInfo 字段......或者找到一种方法来制作 JSON 序列化器处理它!
而且,事实上,XML 也不起作用。这XmlServiceClient
给了我这个错误:
{“第 1 行位置 290 错误。元素 ':AdjustmentRules' 包含映射到名称 ' http://schemas.datacontract.org/2004/07/System:ArrayOfTimeZoneInfo.AdjustmentRule ' 的类型的数据。反序列化器没有知道映射到此名称的任何类型。考虑使用 DataContractResolver 或将与“ArrayOfTimeZoneInfo.AdjustmentRule”对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到已知类型列表中传递给 DataContractSerializer。"}
有谁知道为什么默认情况下不处理它?