我已经实现了这样的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数据服务专门修复此问题?
答案 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序列化代码无法生成这样的字符串。