Format de corps de service Web RESTful

Je suis nouveau à la WCF. Je fais des contrats d’opération RESTful WCF simples. Et, j’ai une question sur les options pour la propriété “BodyStyle” de la classe d’atsortingbuts “WebInvoke”. WebMessageBodyStyle.Bare est une option et WebMessageBodyStyle.Wrapped est l’autre. Quand devrais-je utiliser Bare? Quand devrais-je utiliser Wrapped?

Merci de votre aide.

Supposons que vous avez un contrat avec une demande / réponse XML et un contrat de données simple:

[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 ssortingng Name; [DataMember] public ssortingng Value; } 

Selon la combinaison de BodyStyle , RequestFormat et ResponseFormat vous aurez différents formats mais en général:

WebMessageBodyStyle.Bare demande et la réponse JSON et WebMessageBodyStyle.Bare seront:

Demande:

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

Réponse:

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

WebMessageBodyStyle.Wrapped demande et la réponse JSON et WebMessageBodyStyle.Wrapped seront:

Demande:

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

Réponse:

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

Remarque : vous pouvez modifier le nom par défaut de DoWorkResult :

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

alors à partir de maintenant ce sera:

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

WebMessageBodyStyle.Bare requête et la réponse XML et WebMessageBodyStyle.Bare seront:

Demande:

  name value  

Réponse:

  name value  

XML et WebMessageBodyStyle.Wrapped demande et la réponse sera:

Demande:

    name value   

Réponse:

    name value   

Remarque : vous pouvez également modifier le nom par défaut de DoWorkResult avec le return: MessageParameter

Pour répondre à votre question, quel WebMessageBodyStyle vous devez utiliser dépend de vos besoins et il n’y a pas de règle d’or ici. Pour l’interopérabilité, l’un ou l’autre format peut parfois être requirejs. Mais gardez à l’esprit une limitation du style corps nu: comme il n’y a qu’une racine au format XML et un object au format JSON, un seul paramètre peut être transmis à une méthode. En fait, si vous avez changé un contrat de service en quelque chose comme:

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

un service jetterait une exception:

L’opération ” of contract ” spécifie plusieurs parameters de corps de requête à sérialiser sans éléments d’encapsulation. Au plus, un paramètre de corps peut être sérialisé sans éléments d’encapsulation. Supprimez les parameters de corps supplémentaires ou définissez la propriété BodyStyle sur WebGetAtsortingbute / WebInvokeAtsortingbute sur Wrapped.

L’utilisation de l’emballage dans la description de l’opération encapsule simplement la requête (ou la réponse) dans un élément XML. Par exemple, dans ce contrat:

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

L’entrée pour l’opération Echo est simplement un élément, avec le texte contenu à l’intérieur. De même, sa réponse contient un seul élément avec le retour de l’opération. Pour l’opération EchoWrapped, l’entrée est en fait un élément dont l’enfant est un élément dont l’enfant contient l’entrée de la méthode.

Qu’est-ce qu’un service attend pour l’opération Echo:

 The input 

Qu’est-ce qu’un service attend pour l’opération EchoWrapped:

 Hello wrapped 

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