2
votes

La demande WCF renvoie une mauvaise réponse

J'ai une application c # que le client utilise wcf pour parler au serveur. En arrière-plan toutes les X secondes, le client appelle une méthode Ping sur le serveur (via WCF). L'erreur suivante s'est reproduite plusieurs fois (pour différents appels de méthode):

System.ServiceModel.ProtocolException: Un message de réponse a été reçu pour l'opération 'MyMethodToServer' avec l'action 'http://tempuri.org/IMyInterface/PingServerResponse'. Cependant, votre code client nécessite une action «http://tempuri.org/IMyInterface/MyMethodToServerResponse».

MyMethodToServer n'est pas cohérent et repose sur des méthodes différentes. Comment est-ce possible qu'une demande reçoive une réponse différente?


1 commentaires

Comment avez-vous généré vos classes? avez-vous utilisé svcutil pour le générer?


3 Réponses :


3
votes

Je pense que vous avez un problème assez compliqué avec la communication asynchrone, la suggestion principale (comme votre question n'est pas très claire), est d'essayer d'identifier chaque demande, d'attraper les appels et de les attendre, de faire une communication asyncronique et d'obtenir un plusieurs fonctionnent avec le filetage.

Tel que vous le présentez, c'est un problème d'architecture typique.

Si vous présentez plus de code, puis-je suggérer une correction de code dans ma réponse et je serai heureux de mettre à jour ma réponse.


0 commentaires

2
votes

Si cela se produit de manière aléatoire et pas de manière cohérente, vous pouvez exécuter une configuration à charge équilibrée et déployer une mise à jour sur un seul des serveurs?


0 commentaires

1
votes

Imagination sauvage: votre client utilise la même connexion pour faire deux requêtes en parallèle. Donc ce qui se passe est:

  1. Le thread 1 envoie une requête ARequest
  2. Le thread 2 envoie la demande BRequest
  3. Le serveur envoie une réponse BReply
  4. Le thread 1 reçoit une réponse BReply tout en attendant une réponse

Si vous avez des journaux de requêtes sur le serveur, ce sera facile à confirmer - vous verrez probablement deux requêtes arriver avec un court délai de la part de l'hôte client qui rencontre le problème

Je pense que MaxConcurrentCall et ConcurrencyMode peut être pertinent ici (même si je n'ai pas touché WCF pendant un long moment)


1 commentaires

Je viens de trouver la cause hier, il y avait un bug de fuite de mémoire et l'une des corrections apportées consistait à réutiliser le canal pour les requêtes. Lorsque j'ai créé une nouvelle chaîne pour chaque demande, cela ne s'est plus produit.