Come impostare Json.Net come serializzatore predefinito per il servizio WCF REST

È ansible sovrascrivere il comportamento WCF DataContractSerializer predefinito quando Serialize / DeSerialize quadro e utilizzare invece JSON.NET?

Ho il seguente contratto di servizio per la gestione dell’ quadro della città. Per motivi di progettazione, l’ quadro City ha IsReference = true, pertanto il valore predefinito DataContractSerializer genera errori.

Per i metodi “GET” posso gestire la situazione con JsonConvert.DeserializeObject, ma con i metodi “PUT, POST, DELETE” DataContractSerializer ha la precedenza e non riesce a lamentarsi per le quadro IsReference non può essere serializzato.

Ho trovato questo post per implementare IOperationBehavior e fornire il mio serializzatore ma non so come integrare Json.NET con questo. e credo che ci dovrebbe essere un approccio più diretto per questo.

Gradirei qualsiasi aiuto o guida riguardo a questo scenario, o consigli ad altri approcci.

[ServiceContract] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed) [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class CityService { [Description("Get all Cities")] [WebGet(UriTemplate = "")] public Message Cities() { } [Description("Allows the details of a single City to be updated.")] [WebInvoke(UriTemplate = "{code}", Method = "PUT")] public Message UpdateCity(string code, City city) { } } 

Grazie molto

Hossam

L’uso di Extending Encoder e Serializer (vedi http://msdn.microsoft.com/en-us/library/ms733092.aspx ) o altri metodi di estensione di WCF come l’utilizzo di DataContractSerializerOperationBehavior è molto interessante, ma per il tuo problema speciale ci sono modi di soluzione più semplici.

Se usi già il tipo di Message per restituire i risultati e usi WCF4, puoi fare qualcosa come:

 public Message UpdateCity(string code, City city) { MyResponseDataClass message = CreateMyResponse(); // use JSON.NET to serialize the response data string myResponseBody = JsonConvert.Serialize(message); return WebOperationContext.Current.CreateTextResponse (myResponseBody, "application/json; charset=utf-8", Encoding.UTF8); } 

In caso di errori (come HttpStatusCode.Unauthorized o HttpStatusCode.Conflict ) o in altre situazioni in cui è necessario impostare un codice di stato HTTP (come HttpStatusCode.Created ), è ansible continuare a utilizzare WebOperationContext.Current.OutgoingResponse.StatusCode .

In alternativa puoi anche restituire un Stream (vedi http://blogs.msdn.com/b/carlosfigueira/archive/2008/04/17/wcf-raw-programming-model-web.aspx e http: // msdn .microsoft.com / it / us / library / ms732038.aspx ) invece di Message per restituire qualsiasi dato senza ulteriore elaborazione predefinita dal serializzatore Microsoft JSON. Nel caso di WCF4 è ansible utilizzare CreateStreamResponse (consultare http://msdn.microsoft.com/en-us/library/dd782273.aspx ) anziché CreateTextResponse . Non dimenticare di impostare la posizione del stream su 0 dopo aver scritto nello stream se userai questa tecnica per produrre la risposta.

C’è qualche ragione per cui vuoi usare specificamente la libreria Json.NET. Se si desidera restituire JSON, perché non utilizzare semplicemente la proprietà ResponseFormat dagli attributi WebGet e WebInvoke?

 [WebGet(UriTemplate = "", ResponseFormat = WebMessageFormat.Json)] 

Questo dovrebbe essere nella maggior parte dei casi. Quale versione di WCF stai usando? Qualche motivo per cui stai restituendo un tipo di messaggio piuttosto che il tipo effettivo?

Definirlo nel proprio servizio di configurazione Web sui comportamenti del servizio:

       

o nel contratto operativo della tua interfaccia

 [OperationContract] [WebInvoke(Method = "GET", UriTemplate = "/advertisements/{app_id}/{access_token}/{genero}/{age}", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]