2015-08-31 1 views
0

Tenir compte de la ServiceContract-Interface suivante:La suppression d'un MessageBodyMember dans un MessageContract est-elle considérée comme un changement de rupture?

[ServiceContract] 
public interface ITest 
{ 
    [OperationContract] 
    void MyMethod(MyClass obj); 
} 

Avec MyClass beeing:

[MessageContract] 
public MyClass 
{ 
    [MessageBodyMember(Order = 0)] 
    public int A { get; set; } 

    [MessageBodyMember(Order = 1)] 
    public int B { get; set; } 

    [MessageBodyMember(Order = 2)] 
    public int C { get; set; } 
} 

MyClass est maintenant changé pour ressembler à ce qui suit:

[MessageContract] 
public MyClass 
{ 
    [MessageBodyMember(Order = 0)] 
    public int A { get; set; } 

    [MessageBodyMember(Order = 2)] 
    public int C { get; set; } 
} 

Est-ce qu'un client de consommer ce WCF -Service doit apporter des modifications supplémentaires pour travailler avec la nouvelle définition de service?

En outre, que se passerait-il si je devais en plus changer C pour avoir le nouveau Order = 1?

Répondre

2

Si le client met à jour le fichier WSDL, il obtient une erreur de syntaxe dans le code du client, lorsque le client appelle la méthode.

L'élément de commande définit la position dans la communication que le membre du corps envoie au serveur/client. Vous pouvez le voir dans le journal svc. Exemple .:

<ns2: myClass xmlns:ns2="yourNamespace"> 
<A xmlns=""></A> 
<B xmlns=""></B> 
<C xmlns=""></C> 
</ns2:myClass> 

Après changé l'élément ordner:

<ns2: myClass xmlns:ns2="yourNamespace"> 
<C xmlns=""></C> 
<A xmlns=""></A> 
<B xmlns=""></B> 
</ns2: myClass > 

J'ai essayé l'exemple pour vous. J'ai utilisé un service Web WCF C# et un client C# avec un protocole standard: BasicHttpBinding. Et j'utilise le client de test WCF. Dans cette combinaison, je n'ai pas eu d'erreur dans le client, à condition que le client ne fasse aucune mise à jour WSDL. Dans ce cas, vous pouvez modifier l'élément de commande sans erreurs. Mais ce n'est pas une implémentation correcte; Par conséquent, vous ne pouvez pas supposer que tout fonctionne. Pour les autres clients, voir le résultat pourrait être différent. Par exemple, un client Java est beaucoup plus restrictif.

+0

Merci! Puisque la classe est seulement utilisée pour envoyer des données du client au serveur, je suppose qu'avec votre explication, le client peut toujours utiliser le service même si aucune mise à jour de wsdl n'a été faite? – Shion

+0

Si vous envoyez des données du client au serveur, avec l'objet "MyClient", vous devez remplir l'objet dans le client. Le client ne définit-il pas le MessageBodyMember "B"? – naro

+0

Bien sûr, le client va toujours remplir "B" et le passer au serveur, le client n'a pas mis à jour le wsdl. La question est: Le serveur sera-t-il capable de gérer cela et de répondre à la demande? – Shion

0

Ajout de @ réponse de Naro:

Il est pas un changement de rupture pour les cadres suivants:

  • .NET (C#, 4.5)
  • Java 8

Je n'ai pas testé autre chose car cela n'a pas d'importance pour notre scénario.

Cela signifie que chaque client fonctionne toujours (sans régénérer le client) même après la mise à jour de la définition du service Web.