Question

J'étais curieux de savoir si quelqu'un pourrait préciser quels types de contrat (interface) WCF modifier du côté serveur empêcherait un client d'essayer d'envoyer un message et pourquoi. Je pense que WCF peut gérer certaines divergences, mais je ne sais pas exactement ce que vous pouvez changer en toute sécurité ni ce que vous ne pouvez pas.

  • Ajouter / supprimer des paramètres d'un OperationContract?
  • Ajouter / supprimer / modifier les propriétés sérialisées de DataContract?
  • Ajouter / supprimer des contrats d'opération à un contrat de service?

Un ami a posé une question similaire ici:

ajoute une méthode à une WCF ServiceContract rompt les clients existants?

EDIT: Comme John Saunders l’a souligné, la modification du contrat n’est généralement pas une bonne idée, mais certains éléments intégrés autorisent une certaine tolérance de version (ExtensionDataObject, etc.?). Je voudrais juste savoir à quel point la tolérance de version est flexible.

Était-ce utile?

La solution

Consultez cet article sur dasBlonde: Gestion des versions des contrats de service WCF

Il répertorie les modifications qui vont casser les clients existants:

  1. Supprimer des opérations
  2. Modifier le nom de l'opération
  3. Supprimer les paramètres d'opération
  4. Ajouter des paramètres d'opération
  5. Modifier un nom de paramètre d'opération ou un type de données
  6. Modifier le type de valeur de retour d'une opération
  7. Modifiez le format XML sérialisé pour un type de paramètre (contrat de données) ou une opération (contrat de message) en utilisant explicitement des attributs .NET ou un code de sérialisation personnalisé
  8. Modification des formats de codage des opérations de service (codage RPC et document littéral)

Cet article de Michele explique plus en détail détaillez comment vous pouvez concevoir des contrats plus flexibles.

Autres conseils

Recommandations de conception pour les contrats

  1. Première version

    1.1. Choisissez soigneusement les noms de tous les contrats (interfaces, méthodes, classes et propriétés). Celles-ci seront difficiles à modifier dans les versions futures.

    1.2. N'oubliez pas que les éléments suivants ne peuvent plus être modifiés à l'avenir: nombre de paramètres de méthode, type de paramètres / valeurs / propriétés de retour pour les types non sous votre contrôle.

  2. Version suivante

    2.1. S'il existe déjà, ne modifiez PAS le paramètre Namespace ou Name sur tout xxxContractAttribute.

    2.2. S'il existe déjà, ne modifiez PAS la propriété Order du DataMemberAttribute.

    2.3. Seules les modifications suivantes sont autorisées:

    • Ajouter une méthode (OperationContract) à l'interface (ServiceContract)

    • Renommer la méthode sur l'interface

    • Renommer la classe (DataContract)

    • Ajouter une propriété (DataMember) à la classe (DataContract)

    • Renommer la propriété de la classe

    2.4. Toute suppression brise la compatibilité.

    2.5. Toute autre modification brise la compatibilité.

Voici quelques liens utiles:

" Ajouter / supprimer des paramètres d'un OperationContract " En WCF, ce n’est pas toujours quelque chose qui peut casser votre client, mais vous devez savoir ce que vous faites. En particulier, l'ajout de nouveaux paramètres à un contrat d'opération empêchera les clients hérités de les transmettre et, du côté du service, ils seront définis avec leurs valeurs par défaut. De plus, la suppression de paramètres d'un contrat d'exploitation sera silencieuse du point de vue du client et sera simplement ignorée du côté service. Bien entendu, changer le nom / type du paramètre entraînera la casse du client.

Je pense que la meilleure pratique consiste à considérer les contrats comme des contrats incassables, hmmm, contrats . Ne les changez pas une fois qu'ils sont publiés. Il est assez facile de créer un nouveau contrat avec les modifications souhaitées et d'exposer le nouveau contrat sur un nouveau terminal.

OK Question. En raison d'une syntaxe de nommage incorrecte (le paramètre est spécifié avec une majuscule), je voudrais ajuster un code:

[OperationContract]
public void Foo(string Bar){}

à

[OperationContract]
public void Foo(string bar){}

Un ajustement du contrat de réduction de capital serait-il nécessaire?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top