2012-12-01 17 views
12

JSON.NET ile varsayılan WCF JSON (tüm veri türleri için) serileştirmesini değiştirmek istiyorum. Tüm ağda arama yaptım ve bir çalışma çözümü bulamadım. Bu Web.ConfigVarsayılan JSON serializer'ı WCF 4'te JSON.NET'e değiştirin

 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))); 

     } 

geçerli: Bu Global.asax kodudur

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

: Bu benim WCF fonksiyonudur

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

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

:

Bu

benim nesnedir :

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

ve hizmetler bölümü:

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

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

JSON cevabı besbelli yok sayar:

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

Ve nihayet, bu URL'yi başlatırken ben alıyorum budur JSON.NET özellikleri.

cevap

16

Her neyse, farklı bir seri hale getirici kullanmanın bir yolunu buldum, elle, daha verimli ve daha hızlı görünüyor çünkü Microsoft'un serileştiricisi geçmiyor, ancak kod biraz daha karışıktır.

  1. Seti bunları uygulayan bütün dönüş senin Interfaces "System.ServiceModel.Channels.Message" olarak tipleri ve sınıfları. bir nesneye kolayca dışında bir bellek akışı oluşturmak böylece

    [OperationContract] 
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    System.ServiceModel.Channels.Message GetData(); 
    
  2. JSON.NET seri hale kullanılarak, uzatma yöntemi oluşturmak (veya hangisi kullanmak isteyen). yöntemin vücudunda

    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. , dere kesinlikle hızlıdır size göstermek test sonuçları nelerdir

    return yourObject.GetJsonStream(); 
    
+4

doğrudan tefrika nesneyi döndürmek? Ne yazık ki benzer alternatif teknikleri kullanarak benim test durumumda (500KB nesne hiyerarşisi), JSON.NET serileştirme _plus_ byte dizisinin UTF8'e kopyalanmasının bir çift adımı, bir şekilde sadece basit DataContractJsonSerializer'dan daha pahalı olmasını sağlar. :-( – icelava

İlgili konular