Une connexion existante a été fermée de force par l'hôte distant-WCF
j'ai un service web de la WCF qui fonctionne très bien. Cependant, il y a un appel particulier qui échoue - mais qui échoue seulement pour certains utilisateurs. L'appel est assez simple: c'est un appel pour obtenir une liste des objets de la Personne.
pour L'Utilisateur A il fonctionne très bien. Le service interroge la base de données, crée la liste des objets-personnes et la renvoie à l'application appelante.
Pour l'Utilisateur B il échoue. Ce qui est bizarre, c'est que quand je fais du débogage le service semble bien fonctionner. Il est capable d'interroger la base de données et il crée l'objet List et le renvoie. Le service lui-même n'échoue jamais. Mais l'application client reçoit "Une connexion existante a dû être fermée par l'hôte distant" erreur.
pour moi, il semble qu'il se passe quelque chose quand la couche service essaie d'empaqueter les données au format XML pour les renvoyer à l'application appelant. Je pense que ce doit être un problème lié à la parce que l'appel fonctionne bien pour d'autres utilisateurs. J'ai visuellement regardé les données et je ne vois rien d'étrange. Une supposition est que les données pour L'utilisateur B a certains caractères cachés funky ou quelque chose et provoque donc le service à fermer de manière inattendue. Quelque chose comme ça.
des idées?
11 réponses
la meilleure chose que j'ai trouvée pour diagnostiquer ce genre de choses est le Service trace viewer. C'est assez simple à configurer (en supposant que vous pouvez éditer les configs):
http://msdn.microsoft.com/en-us/library/ms732023.aspx
Espérons que cette aide.
j'ai eu ce problème parce que mon site web n'avait pas de certificat relié au port SSL. J'ai pensé le mentionner parce que je n'ai trouvé cette réponse nulle part dans le googleweb et ça m'a pris des heures pour le découvrir. Rien n'est apparu dans le visualiseur d'événements, ce qui était totalement génial pour le diagnostiquer. J'espère que ça évitera à quelqu'un d'autre de souffrir.
Je l'ai vu une fois. Les utilisateurs demandent-ils des quantités différentes de données? J'ai trouvé que même si vous pouvez configurer une liaison pour les charges utiles de données (i.e. maxReceivedMessageSize
), le httpRuntime
maxRequestLength
l'emporte sur le paramètre WCF, donc si IIS essaye de servir une requête qui dépasse cela, il montre ce comportement.
pensez-y comme ceci:
si maxReceivedMessageSize
est 12MB dans votre comportement WCF, et maxRequestLength
est 4MB (par défaut), IIS gagne.
j'ai trouvé que vous pouvez obtenir cette erreur si l'objet retourné a getter seulement auto propriétés sont initialisées dans le constructeur (avec C# 6.0 syntaxe).
je crois que c'est dû à la désérialisation des objets du côté client par WCF en utilisant un constructeur sans paramètre puis en définissant les propriétés sur l'objet. Il doit avoir un set
disponible (il peut être privé) pour remplir l'objet, sinon, il va échouer.
je viens d'avoir cette erreur maintenant dans le serveur seulement et la solution était de mettre un attribut maxItemsInObjectGraph
dans WCF web.config
sous <behavior>
tag:
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
j'ai le même problème. Ma solution est la suivante:
si vous utilisez LinQ2SQL dans votre projet, ouvrez votre fichier dbml dans Visual Studio et changez le Mode de sérialisation en "unidirectionnel "on
j'ai enregistré la même exception et j'ai trouvé un InnerException: SocketException.
dans la trace svclog.
après avoir regardé dans le journal d'événements windows, j'ai vu une erreur provenant de la classe System.ServiceModel.Activation.TcpWorkerProcess
.
hébergez-vous votre service wcf dans IIS avec netTcpBinding et port sharing?
il semble qu'il y ait un bug dans la fonctionnalité de partage de port IIS, vérifiez le fix :
ma solution est d'accueillir votre WCF service dans un service Windows.
après m'avoir retiré les cheveux pendant environ 6 heures de cette erreur complètement inutile, mon problème a fini par être que mon data transfer objects
étaient trop complexes. Commencez par les propriétés uber simples comme public long Id { get; set;}
c'est tout... rien de fantaisie.
Le problème que j'ai eu était aussi avec la sérialisation. La cause en est que certaines de mes classes de DTO/business ont été renommées ou supprimées sans mettre à jour la référence de service. Je suis surpris de ne pas avoir eu un contract filter mismatch error
à la place. Mais la mise à jour du service ref A CORRIGÉ l'erreur pour moi (même erreur que OP).
dans mon cas, c'était aussi avec serialization. J'ai besoin d'ajouter
[KnownType(typeof(...)]
pour toutes les classes qui pourraient apparaître dans la sérialisation.
j'ai eu ce problème se produire lors du débogage d'un projet web à un service web dans la même solution. Le service web retournait des réponses que le projet web ne pouvait pas comprendre. Ça marcherait à nouveau à certains moments, puis ça s'arrêterait à nouveau.
c'était parce qu'il n'y avait pas de référence explicite entre ces projets, de sorte que le service web n'était pas construit en tapant F5 pour commencer le débogage. Une fois que j'ai ajouté cela, les erreurs ont disparu.