如何正确处理WCF数据服务的JSON日期格式问题

时间:2012-08-27 19:54:15

标签: .net json wcf-data-services

我已经实现了这样的WCF数据服务服务:

[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class SampleService : DataService<SampleDatabase>
{
    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {

        // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
        // Examples:
        config.SetEntitySetAccessRule("SampleData", EntitySetRights.All);
        // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        config.UseVerboseErrors = true;
    }
}

但是,正如其他地方所述,日期未被框架JSON序列化代码正确格式化。日期不以有效的ISO格式输出。更令人惊讶的是,WCF不会对输出日期进行往返。因此它输出一个如下所示的日期:“/ Date(1325376000000)/”,但不接受与返回的有效日期相同的值。

Hanselman如何为WebAPI修复它: http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx

我发现了MVC序列化的类似修复: http://www.dalsoft.co.uk/blog/index.php/2012/01/10/asp-net-mvc-3-improved-jsonvalueproviderfactory-using-json-net/

我们的客户已经指定了MVC3和.NET 4,所以我认为WebAPI已经出局了,所以我想为.NET 4中的MVC3 + WCF数据服务解决这个问题。我对上述修复的理解是最好的修复是使用JSON.NET覆盖序列化/反序列化为ISO格式,.NET和Javascript都能理解。但是我无法找到任何关于覆盖JSON序列化的指导。

如何针对.NET 4中的WCF数据服务专门修复此问题?

1 个答案:

答案 0 :(得分:2)

在OData V3中,Verbose中的日期时间JSON也是使用ISO格式编写的。为此,您必须安装WCF数据服务5.0(实现OData V3),允许服务器上的V3并修改客户端以请求V3(因为V2有效负载将具有旧格式以实现向后兼容)。要强制使用V3有效载荷格式,客户端可以发送MinDataServiceVersion:3.0;报头中。

注意:旧格式实际上是往返,但它使用棘手的JSON转义。实际格式为\/Date(12345678)\/(在语义上相同/Date(12345678)/,但在线上它看起来不同)。不幸的是,浏览器中的JSON序列化代码无法生成这样的字符串。