2010-10-15 22 views
0

J'ai un service WCF. J'ai changé le nom de la variable dans DataContract, le service reconstruit mais n'a pas client reconstruitContrat de service et noms de variables

Avant, c'est un contrat d'exploitation pour le client

[OperationContract(Name = "SubscribeWcfProvider")] 
bool Subscribe(Guid subscriptionid); 

Après, c'est un contrat d'exploitation pour le service

[OperationContract(Name = "SubscribeWcfProvider")] 
bool Subscribe(Guid subscriberId); 

Maintenant, lorsque le client appelle la méthode, le Guid est toujours nul. Il semble que je ne peux pas changer les noms de variables? Pourquoi donc?

MISE À JOUR

S'il vous plaît dire ce qui se passe derrière la scène? Comment un appel de fonction est converti en message?

Répondre

4

Le proxy que vous avez généré a été (selon toute vraisemblance) créé avant le changement et n'est pas régénéré après celui-ci. Donc, le proxy "codé" les paramètres basés sur le WSDL (je suppose que vous utilisez SOAP). Voici un exemple de message SOAP (tiré de this site).

<?xml version='1.0'?> 
<SOAP:Envelope 
    xmlns:SOAP='urn:schemas-xmlsoap-org:soap.v1'> 
<SOAP:Body> 
    <i:getBalance 
    xmlns:i='urn:develop-com:IBank'> 
    <account>23619-22A</account> 
    </i:getBalance> 
</SOAP:Body> 
</SOAP:Envelope> 

Dans ce cas, la méthode getBalance attend le paramètre de compte. Si cela change du côté du serveur et que le client n'obtient pas le nouveau contrat et reconstruit le proxy, il ne pourra pas envoyer le bon paramètre.

Notez que si vous besoin de faire casser des changements comme ceux-ci dans votre code sans rupture du contrat, vous pouvez appliquer le MessageParameterAttribute sur le paramètre de la manière suivante:

[OperationContract(Name = "SubscribeWcfProvider")] 
bool Subscribe([MessageParameter(Name = "subscriptionid")]Guid subscriberId); 

Il est un bon exemple sur cela sur MSDN qui montre le code que vous avez besoin d'éditer ainsi que le message qui sera envoyé.

Je vous recommande de jeter un coup d'œil sur le WSDL généré par votre service afin de voir en action ce qui se passe dans les coulisses.

1

Cela dépend de votre choix de sérialisation. En général, si le nom du paramètre apparaît dans le message sérialisé, il ne se traduira pas correctement si vous changez son nom dans le service et non le client - et c'est presque toujours le cas (SOAP, XML, JSON, etc.).