将WCF 4中的默认JSON序列化程序替换为JSON.NET

我想用JSON.NET替换默认的WCF JSON(对于所有数据类型)序列化。 我在网上搜索过,找不到合适的解决方案。

这是我的目标:

[JsonObject] public class TestObject { [JsonProperty("JsonNetName")] public string Name = "John"; [JsonProperty] public DateTime Date = DateTime.Now; } 

这是我的WCFfunction:

  [OperationContract] [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] List Get(); 

这是Global.asax中的代码:

  protected void Application_Start(object sender, EventArgs e) { // Create Json.Net formatter serializing DateTime using the ISO 8601 format var serializerSettings = new JsonSerializerSettings(); serializerSettings.Converters.Add(new IsoDateTimeConverter()); serializerSettings.Converters.Add(new BinaryConverter()); serializerSettings.Converters.Add(new JavaScriptDateTimeConverter()); serializerSettings.Converters.Add(new BinaryConverter()); serializerSettings.Converters.Add(new StringEnumConverter()); var config = HttpHostConfiguration.Create().Configuration; Microsoft.ApplicationServer.Http.JsonMediaTypeFormatter jsonFormatter = config.OperationHandlerFactory.Formatters.JsonFormatter; config.OperationHandlerFactory.Formatters.Remove(jsonFormatter); config.OperationHandlerFactory.Formatters.Insert(0, new JsonNetMediaTypeFormatter(serializerSettings)); var httpServiceFactory = new HttpServiceHostFactory { OperationHandlerFactory = config.OperationHandlerFactory, MessageHandlerFactory = config.MessageHandlerFactory }; //Routing RouteTable.Routes.Add( new ServiceRoute( "Brands", httpServiceFactory, typeof(Brands))); } 

这是Web.Config:

       

和服务部分:

        

最后,这是我在启动URL时得到的:

“ http:// localhost:30000 / Brands / Get ”

 [{"Date":"\/Date(1354364412708+0200)\/","Name":"John"}, {"Date":"\/Date(1354364412708+0200)\/","Name":"John"}] 

JSON答案显然忽略了JSON.NET属性。

无论如何,我想出了一种方法来手动使用不同的串行器,它似乎更高效,更快,因为它不通过微软的串行器,虽然代码方面它有点混乱。

  1. 在接口和实现它们的类中将所有返回类型设置为“System.ServiceModel.Channels.Message”。

     [OperationContract] [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] System.ServiceModel.Channels.Message GetData(); 
  2. 创建一个扩展方法,以便您可以使用JSON.NET序列化程序(或您想要使用的任何一个)轻松地从对象构建内存流。

     public static System.ServiceModel.Channels.Message GetJsonStream(this object obj) { //Serialize JSON.NET string jsonSerialized = JsonConvert.SerializeObject(obj); //Create memory stream MemoryStream memoryStream = new MemoryStream(new UTF8Encoding().GetBytes(jsonSerialized)); //Set position to 0 memoryStream.Position = 0; //return Message return WebOperationContext.Current.CreateStreamResponse(memoryStream, "application/json"); } 
  3. 在方法的主体中,将序列化的对象直接返回到流

     return yourObject.GetJsonStream();