无论如何,是否可以在WCF中更改DateTime的默认JSON序列化/反序列化?
目前,DateTime已序列化为该/Date(1372252162657+0200)/格式,应该没问题,但是当我的服务器不在UTC中时(我无法更改),我遇到了问题。
/Date(1372252162657+0200)/
此服务正在处理的所有日期/时间数据均为UTC格式。服务器处于UTC时一切正常。但是,暂存/生产环境设置为GMT + 1(Paris),并且序列化程序假定日期/时间在GMT + 1中,而完全忽略了该属性Kind。因此,正如您期望的那样DateTime.SetKind(),将其设置为UTC不会起作用。实际上,序列化的时间延迟了一个小时。
Kind
DateTime.SetKind()
我既可以进行双向日期对话(在反序列化时也进行相同的假设,因此始终为GMT + 1):日期对话:UTC往返服务器时间,但这非常乏味。所以我想也许我可以覆盖默认的序列化行为。
是的,可以使用称为“ 消息格式器 ” 的概念来完成此操作
但是Message Formatter会很困难并且超出范围,无法在此处解释堆栈溢出。您可以参考WCF可扩展性:消息格式化程序
如果您不希望将其弄乱,那么可以使用hack。
将每个方法的返回类型设置为Stream。
例如
public Stream GetStaticData() { var objTobeReturned = something; WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8"; return new MemoryStream(Encoding.UTF8.GetBytes(objTobeReturned.ToJson())); }
这里ToJson()是我自己的扩展方法,该方法使用NewtonSoft库将对象转换为json字符串。
WCF将跳过流输出以进行序列化,并将其原样传递给您的客户端。
我希望你能得到答案。