Desidero sostituire la serializzazione JSON WCF predefinita (per tutti i tipi di dati) con JSON.NET. Ho cercato su tutta la rete e non sono riuscito a trovare una soluzione funzionante.Sostituire serializzatore JSON predefinito in WCF 4 in JSON.NET
Questo è il mio oggetto:
[JsonObject]
public class TestObject
{
[JsonProperty("JsonNetName")]
public string Name = "John";
[JsonProperty]
public DateTime Date = DateTime.Now;
}
Questa è la mia funzione di WCF:
[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
List<TestObject> Get();
Questo è il codice in 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)));
}
Questo è Web.Config :
<endpointBehaviors>
<behavior name="Behavior_Brands">
<webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Bare" />
</behavior>
</endpointBehaviors>
e la sezione servizi:
<service name="TestApp.CoreWCF.Brands">
<endpoint address="" behaviorConfiguration="Behavior_Brands" binding="webHttpBinding" contract="TestApp.CoreWCF.IBrands">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</service>
E, infine, questo è quello che sto ricevendo al momento del lancio l'URL:
"http://localhost:30000/Brands/Get"
[{"Date":"\/Date(1354364412708+0200)\/","Name":"John"}, {"Date":"\/Date(1354364412708+0200)\/","Name":"John"}]
La risposta JSON ignora ovviamente la Attributi JSON.NET.
Quali sono i risultati dei test indicano che v'è sicuramente più veloce? Sfortunatamente per il mio caso di test (gerarchia di oggetti 500KB) utilizzando tecniche alternative simili, sembra che il doppio passo della serializzazione JSON.NET _plus_ byte array che copia su UTF8 lo rende in qualche modo più costoso di un semplice DataContractJsonSerializer. :-( – icelava