121 votes

WCF - Mismatch ContractFilter à l'exception EndpointDispatcher

J'ai le scénario suivant que j'essaie de tester :

  1. Un WSDL commun
  2. Point de terminaison WCF qui met en œuvre des objets basés sur le WSDL et est hébergé dans IIS.
  3. Une application client qui utilise un proxy basé sur le WSDL pour créer des requêtes.

Lorsque j'effectue un appel WS du client vers le point de terminaison du service, j'obtiens l'exception suivante :

{"Le message avec l'action 'http://IMyService/CreateContainer' ne peut pas être traité par le récepteur, en raison d'une inadéquation du ContractFilter au niveau du EndpointDispatcher. Cela peut être dû à un désaccord contractuel (actions non concordantes entre l'expéditeur et le destinataire) ou à un désaccord de liaison/sécurité entre l'expéditeur et le destinataire. Vérifiez que l'émetteur et le récepteur ont le même contrat et la même liaison (y compris les exigences de sécurité, par exemple Message, Transport, None)."}

J'ai commencé à utiliser MS Service Trace Viewer, mais je ne sais pas trop où regarder. En regardant les classes du client et du point de terminaison, elles semblent identiques. Comment commencer à déboguer ce problème ? Quelles sont les causes possibles de cette exception ?

79voto

Tragedian Points 12308

Un "ContractFilter mismatch at the EndpointDispatcher" signifie que le récepteur n'a pas pu traiter le message parce qu'il ne correspondait à aucun des contrats que le récepteur a configurés pour le point d'extrémité qui a reçu le message.

Cela peut être dû au fait que :

  • Vous avez des contrats différents entre le client et l'expéditeur.
  • Vous utilisez une liaison différente entre le client et l'expéditeur.
  • Les paramètres de sécurité du message ne sont pas cohérents entre le client et l'expéditeur.

Jetez un coup d'œil à la EndpointDispatcher pour plus d'informations sur le sujet.

3 votes

Vérifiez également que l'attribut de service est correct dans le fichier .svc. Voir ma réponse ci-dessous.

0 votes

Je voulais juste ajouter à la solution ci-dessus (pour les nouveaux arrivants) car j'ai rencontré le même problème mais la solution ci-dessus n'a pas fonctionné pour moi. Si vous avez déjà essayé les solutions de contournement ci-dessus et que vous obtenez toujours la même erreur, essayez de mettre à jour votre configuration en retapant simplement les points de terminaison impliqués, même si elle est déjà correcte sur le serveur et le client.

75voto

adam Points 311

J'ai eu cette erreur et elle a été causée par le contrat de récepteur ne mettant pas en application la méthode étant appelée. En fait, quelqu'un n'avait pas déployé la dernière version du service WCF sur le serveur hôte.

13 votes

+1 - La même chose m'est arrivée, sauf que dans mon cas c'était moi qui était le "quelqu'un". J'avais oublié de commiter et de déployer le code côté serveur.

2 votes

Ouaip, je me suis trompé dans le nom de l'action SOAP. Il voulait tempuri.org/ICodeGenService/RenderApp mais, pour une raison quelconque, le code qui a analysé le WSDL a cru que tempuri.org/RenderApp .

0 votes

Moi aussi. J'avais la méthode dans mon .SVC.CS, mais pas d'OperationContract correspondant dans mon interface.

24voto

boomhauer Points 2392

Vous obtiendrez également ceci si vous essayez de vous connecter à la mauvaise URL ;)

J'ai deux points de terminaison et deux services définis dans mon système, avec des noms similaires. J'ai obtenu cette erreur exacte lorsque les urls ont été échangées sur mon client à un moment donné. Je me suis vraiment gratté la tête jusqu'à ce que je comprenne enfin cette erreur stupide.

3 votes

C'est une erreur stupide à commettre, c'est sûr, mais une réponse très utile ici. Comme c'est quelque chose d'évident, on peut facilement l'oublier.

0 votes

Une url incorrecte est donnée - erreur "aucun point d'accès n'a été écouté".

0 votes

Je peux confirmer, j'ai mis des urls inversées par accident et c'est l'erreur que j'ai obtenue. Après avoir vu ceci, j'ai réalisé que cela pouvait être un problème en premier lieu et en l'examinant de plus près, c'était bien le problème !

20voto

Rob Points 141

J'ai eu ce problème et j'ai découvert que dans mon générateur de proxy, que j'ai copié d'un autre service, j'ai oublié de changer le nom du service.

J'ai changé ça

Return New Service1DataClient(binding, New EndpointAddress(My.Settings.WCFServiceURL & "/Service1Data.svc"))

à

Return New Service2DataClient(binding, New EndpointAddress(My.Settings.WCFServiceURL & "/Service2Data.svc"))

C'était une simple erreur de code presque impossible à déboguer. J'espère que cela fera gagner du temps à quelqu'un.

0 votes

Merci, j'avais le même problème !

9voto

ben Points 302

J'ai résolu ce problème en ajoutant ce qui suit à l'implémentation de mon contrat :

[ ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

Par exemple :

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class MyUploadService : IMyUploadService
{

}

0 votes

Cela a résolu mon problème avec un port transféré. Merci.

0 votes

Non j'ai eu une nouvelle erreur, je déteste IIS - CommunicationException : Le serveur n'a pas fourni de réponse significative ; cela peut être dû à une inadéquation du contrat, à une fermeture prématurée de la session ou à une erreur interne du serveur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X