2012-12-01 21 views
12

में डिफ़ॉल्ट JSON serializer को बदलें, मैं JSON.NET के साथ डिफ़ॉल्ट WCF JSON (सभी डेटा प्रकारों के लिए) क्रमबद्धता को प्रतिस्थापित करना चाहता हूं। मैंने पूरे नेट पर खोज की है और एक कामकाजी समाधान नहीं मिला।डब्ल्यूसीएफ 4 में JSON.NET

 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 है:

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

यह Global.asax में कोड है:

[JsonObject] 
public class TestObject 
{ 
    [JsonProperty("JsonNetName")] 
    public string Name = "John"; 

    [JsonProperty] 
    public DateTime Date = DateTime.Now; 
} 

यह मेरा WCF समारोह है:

यह मेरा वस्तु है :

<endpointBehaviors> 
    <behavior name="Behavior_Brands"> 
     <webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Bare" /> 
    </behavior> 
    </endpointBehaviors> 

और सेवाओं अनुभाग:

"http://localhost:30000/Brands/Get"

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

JSON जवाब स्पष्ट रूप से ध्यान नहीं देता:

<service name="TestApp.CoreWCF.Brands"> 
    <endpoint address="" behaviorConfiguration="Behavior_Brands" binding="webHttpBinding" contract="TestApp.CoreWCF.IBrands"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    </service> 

और अंत में, यह जब URL की शुरूआत मैं क्या हो रही है है JSON.NET विशेषताएँ।

उत्तर

16

वैसे भी, मैंने एक अलग सीरिएलाइज़र का उपयोग करने का एक तरीका निकाला है, मैन्युअल रूप से, यह अधिक कुशल और तेज़ लगता है क्योंकि यह माइक्रोसॉफ्ट के सीरिएलाइज़र से गुज़रता नहीं है, हालांकि कोड के अनुसार यह थोड़ा गड़बड़ है।

  1. सेट के रूप में "System.ServiceModel.Channels.Message" अपने इंटरफेस में सभी वापसी प्रकार और वर्गों उन्हें लागू करने।

    [OperationContract] 
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    System.ServiceModel.Channels.Message GetData(); 
    
  2. एक विस्तार पद्धति बनाएं ताकि आप आसानी से एक वस्तु के बाहर एक स्मृति धारा का निर्माण कर सकता है, JSON.NET serializer का उपयोग कर (या जो भी आप उपयोग करना चाहते हैं)।

    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(); 
    
+4

क्या परीक्षण के परिणाम है कि आप करने के लिए संकेत मिलता है यह निश्चित रूप से तेजी से होता है कर रहे हैं के लिए सीधे धारावाहिक वापसी? दुर्भाग्यवश मेरे वैकल्पिक मामले (500 केबी ऑब्जेक्ट पदानुक्रम) के लिए इसी तरह की वैकल्पिक तकनीकों का उपयोग करके, ऐसा लगता है कि यूएसएफ 8 की प्रतिलिपि JSON.NET serialization _plus_ बाइट सरणी का डबल चरण किसी भी तरह से यह केवल सादा DataContractJsonSerializer की तुलना में अधिक महंगा बनाता है। :-( – icelava