Formato corpo servizio web RESTful

Sono nuovo di WCF. Sto facendo alcuni semplici contratti di operazioni WCF RESTful. E, ho una domanda sulle opzioni per la proprietà “BodyStyle” della class di attributi “WebInvoke”. Un’opzione è WebMessageBodyStyle.Bare e l’altra è WebMessageBodyStyle.Wrapped. Quando dovrei usare Bare? Quando dovrei usare Wrapped?

Grazie per l’aiuto.

Supponiamo che tu abbia qualche contratto con la richiesta / risposta XML e qualche semplice contratto di dati:

[ServiceContract] public interface IService { ... [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] Entity DoWork(Entity entity); ... } [DataContract] public class Entity { [DataMember] public string Name; [DataMember] public string Value; } 

A seconda della combinazione di BodyStyle , RequestFormat e ResponseFormat avrai diversi formati ma in generale:

JSON e WebMessageBodyStyle.Bare richiesta e la risposta saranno:

Richiesta:

 {"Name":"name","Value":"value"} 

Risposta:

 {"Name":"ResultName:name","Value":"ResultValue:value"} 

JSON e WebMessageBodyStyle.Wrapped richiesta e la risposta WebMessageBodyStyle.Wrapped saranno:

Richiesta:

 {"entity":{"Name":"name","Value":"value"}} 

Risposta:

 {"DoWorkResult":{"Name":"name","Value":"value"}} 

Nota : è ansible modificare il nome predefinito DoWorkResult come proprio:

 [return: MessageParameter(Name = "MyResult")] Entity DoWork(Entity entity);` 

quindi da ora questo sarà:

 {"MyResult":{"Name":"name","Value":"value"}} 

XML e WebMessageBodyStyle.Bare richiesta e la risposta saranno:

Richiesta:

  name value  

Risposta:

  name value  

XML e WebMessageBodyStyle.Wrapped richiesta e la risposta WebMessageBodyStyle.Wrapped saranno:

Richiesta:

    name value   

Risposta:

    name value   

Nota : è anche ansible modificare il nome predefinito DoWorkResult con il return: MessageParameter

Per rispondere alla tua domanda, quale WebMessageBodyStyle dovresti usare dipende dalle tue esigenze e non c’è nessuna regola d’oro qui. Per l’interoperabilità, a volte può essere richiesto uno o l’altro formato. Ma tieni a mente una limitazione dello stile del corpo nudo: poiché esiste una sola radice in formato XML e un object in formato JSON, solo un parametro può essere passato a un metodo. Infatti, se hai cambiato un contratto di assistenza in qualcosa di simile:

 [OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] Entity DoWork(string id, Entity entity); 

un servizio genererebbe un’eccezione:

L’operazione ” del contratto ” specifica più parametri del corpo della richiesta da serializzare senza alcun elemento wrapper. Al massimo un parametro del corpo può essere serializzato senza elementi wrapper. Rimuovere i parametri extra del corpo o impostare la proprietà BodyStyle su WebGetAttribute / WebInvokeAttribute su Wrapped.

L’uso del wrapper sulla descrizione dell’operazione racchiude semplicemente la richiesta (o la risposta) in un elemento XML. Ad esempio, in questo contratto:

 [ServiceContract] public interface ITest { [OperationContract] [WebInvoke(BodyStyle = WebMessageBodyStyle.Bare)] string Echo(string text); [OperationContract] [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] string EchoWrapped(string text); [OperationContract] [WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] int Divide(int dividend, int divisor, out int reminder); } 

L’input per l’operazione Echo è semplicemente un elemento, con il testo contenuto all’interno. Allo stesso modo, la sua risposta contiene un singolo elemento con il ritorno dell’operazione. Per l’operazione EchoWrapped, l’input è in realtà un elemento, il cui figlio è un elemento il cui figlio contiene l’input per il metodo.

Cosa si aspetta un servizio per l’operazione Echo:

 The input 

Cosa si aspetta un servizio per l’operazione EchoWrapped:

 Hello wrapped 

Fonte: http://social.msdn.microsoft.com/Forums/vstudio/en-US/9db6793b-8db9-479b-825c-e781d023f6c1/bodystylewebmessagebodystylewrapped-with-requestformatwebmessageformatxml-for-post?forum=wcf