L’hôte distant a fermé la connexion. Le code d’erreur est 0x800704CD

Je reçois des e-mails d’erreur de mon site chaque fois qu’une exception se produit. Je reçois cette erreur:

L’hôte distant a fermé la connexion. Le code d’erreur est 0x800704CD

et ne sais pas pourquoi. J’en ai environ 30 par jour. Je ne peux pas reproduire l’erreur non plus, donc je ne peux pas trouver le problème.

Le site Web est ASP.NET 2 exécuté sur IIS7.

Trace de la stack:

à System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError (résultat Int32, booléen throwOnDisconnect) à System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush () à System.Web.HttpResponse.Flush (Boolean finalFlush) à System.Web.HttpResponse.Flush ( ) à System.Web.HttpResponse.End () à System.Web.UI.HttpResponseWrapper.System.Web.UI.IHttpResponse.End () à System.Web.UI.PageRequestManager.OnPageError (expéditeur d’object, EventArgs e) à System .Web.UI.TemplateControl.OnError (EventArgs e) à System.Web.UI.Page.HandleError (Exception e) à System.Web.UI.Page.ProcessRequestMain (booléen includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) à System.Web.UI. Page.ProcessRequest (booléen includeStagesBeforeAsyncPoint, booléen includeStagesAfterAsyncPoint) à System.Web.UI.Page.ProcessRequest () à System.Web.UI.Page.ProcessRequestWithNoAssert (contexte HttpContext) à System.Web.UI.Page.ProcessRequest (contexte HttpContext) à ASP.default_aspx.ProcessRequest (contexte HttpContext) à System.Web.H ttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () à System.Web.HttpApplication.ExecuteStep (étape IExecutionStep, Boolean & completedSynchronously)

Je reçois celui-ci tout le temps. Cela signifie que l’utilisateur a commencé à télécharger un fichier, puis il a échoué ou l’a annulé .

Pour reproduire cette exception, essayez de le faire vous-même, mais je ne connais aucun moyen de l’éviter (sauf pour gérer cette exception spécifique uniquement).

Vous devez décider quelle est la meilleure voie à suivre en fonction de votre application.

Comme m.edmondson l’a mentionné , “l’hôte distant a fermé la connexion”. se produit lorsqu’un utilisateur ou un navigateur annule quelque chose , ou que la connexion réseau est interrompue, etc. Il ne doit pas nécessairement s’agir d’un téléchargement de fichier, mais uniquement d’une requête pour toute ressource entraînant une réponse au client. Fondamentalement, l’erreur signifie que la réponse n’a pas pu être envoyée car le serveur ne peut plus parler au client (navigateur).

Vous pouvez prendre un certain nombre de mesures pour empêcher que cela se produise. Si vous envoyez manuellement quelque chose dans la réponse avec Response.Write, Response.Flush, en retournant des données à partir d’une méthode de service Web / page ou quelque chose de similaire, vous devriez alors vérifier Response.IsClientConnected avant d’envoyer la réponse. De plus, si la réponse risque de prendre beaucoup de temps ou si beaucoup de traitement côté serveur est requirejs, vérifiez-le régulièrement jusqu’à ce que response.end soit appelé. Voir les informations suivantes pour plus de détails sur cette propriété:

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.isclientconnected.aspx

Alternativement, ce qui est le plus probable dans votre cas, l’erreur est provoquée par quelque chose dans le cadre. Le lien suivant peut être utilisé:

http://blog.whitesites.com/fixing-The-remote-host-closed-the-connection-The-error-code-is-0x80070057__633882307305519259_blog.htm

Le message suivant de stack-overflow pourrait également vous intéresser:

“L’hôte distant a fermé la connexion” dans Response.OutputStream.Write

On peut reproduire l’erreur avec le code ci-dessous:

 public ActionResult ClosingTheConnectionAction(){ try { //we need to set buffer to false to //make sure data is written in chunks Response.Buffer = false; var someText = "Some text here to make things happen ;-)"; var content = GetBytes( someText ); for(var i=0; i < 100; i++) { Response.OutputStream.Write(content, 0, content.Length); } return View(); } catch(HttpException hex) { if (hex.Message.StartsWith("The remote host closed the connection. The error code is 0x800704CD.")) { //react on remote host closed the connection exception. var msg = hex.Message; } } catch(Exception somethingElseHappened) { //handle it with some other code } return View(); } 

Exécutez maintenant le site Web en mode débogage. Placez un point d'arrêt dans la boucle qui écrit dans le stream de sortie. Accédez à cette méthode d'action et après la première itération passée fermez l'onglet du navigateur. Appuyez sur F10 pour continuer la boucle. Après avoir atteint l'itération suivante, vous verrez l'exception. Profitez de votre exception 🙂

J’ai eu cette erreur lorsque j’ai lu dynamicment les données d’un WebRequest et que WebRequest n’ai jamais fermé la Response .

  protected System.IO.Stream GetStream(ssortingng url) { try { System.IO.Stream stream = null; var request = System.Net.WebRequest.Create(url); var response = request.GetResponse(); if (response != null) { stream = response.GetResponseStream(); // I never closed the response thus resulting in the error response.Close(); } response = null; request = null; return stream; } catch (Exception) { } return null; } 

Je recevais cela sur un site asp.net 2.0 iis7 Windows2008. Même code sur iis6 a bien fonctionné. Cela posait un problème pour moi car cela gâchait le processus de connexion. L’utilisateur se connecterait et obtiendrait un 302 dans default.asxp, qui passerait par page_load, mais pas aussi loin que pre-render avant qu’iis7 n’envoie un 302 à login.aspx sans le cookie d’authentification. J’ai commencé à jouer avec les parameters du pool d’applications et, pour une raison quelconque, «activer les applications 32 bits» semble avoir résolu le problème. Aucune idée de la raison, car ce site ne fait rien de spécial qui nécessite des pilotes 32 bits. Certains sites utilisent toujours Access qui nécessitent 32 bits, mais pas nos sites SQL simples comme celui-ci.

J’ai aussi eu cette même erreur sur mon gestionnaire d’images que j’ai écrit. Je l’ai eu comme 30 fois par jour sur le site avec un trafic lourd, a réussi à le reproduire aussi. Vous obtenez ceci lorsqu’un utilisateur annule la demande (ferme la page ou sa connexion internet est interrompue par exemple), dans mon cas dans la ligne suivante:

 myContext.Response.OutputStream.Write(buffer, 0, bytesRead); 

Je ne peux penser à aucun moyen de le prévenir, mais peut-être que vous pouvez gérer cela correctement. Ex:

  try { … myContext.Response.OutputStream.Write(buffer, 0, bytesRead); … }catch (HttpException ex) { if (ex.Message.StartsWith("The remote host closed the connection.")) ;//do nothing else //handle other errors } catch (Exception e) { //handle other errors } finally {//close streams etc.. }