一尘不染

在WCF中更改默认日期序列化

json

无论如何,是否可以在WCF中更改DateTime的默认JSON序列化/反序列化?

目前,DateTime已序列化为该/Date(1372252162657+0200)/格式,应该没问题,但是当我的服务器不在UTC中时(我无法更改),我遇到了问题。

此服务正在处理的所有日期/时间数据均为UTC格式。服务器处于UTC时一切正常。但是,暂存/生产环境设置为GMT +
1(Paris),并且序列化程序假定日期/时间在GMT +
1中,而完全忽略了该属性Kind。因此,正如您期望的那样DateTime.SetKind(),将其设置为UTC不会起作用。实际上,序列化的时间延迟了一个小时。

我既可以进行双向日期对话(在反序列化时也进行相同的假设,因此始终为GMT +
1):日期对话:UTC往返服务器时间,但这非常乏味。所以我想也许我可以覆盖默认的序列化行为。


阅读 343

收藏
2020-07-27

共1个答案

一尘不染

是的,可以使用称为“ 消息格式器 ” 的概念来完成此操作

但是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将跳过流输出以进行序列化,并将其原样传递给您的客户端。

我希望你能得到答案。

2020-07-27