Je reçois des courriels d'erreur de mon site Web 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 je ne sais pas pourquoi. Je reçois environ 30 par jour. Je ne peux pas reproduire l'erreur non plus, donc je ne peux pas localiser le problème.
Le site Web est ASP.NET 2 fonctionnant sur IIS7.
Trace de la pile:
à System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError (résultat Int32, Boolean throwOnDisconnect) à System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush () à System.Web.HttpResponse.Flush (boolean final) ) à System.Web.HttpResponse.End () à System.Web.UI.HttpResponseWrapper.System.Web.UI.IHttpResponse.End () à System.Web.UI.PageRequestManager.OnPageError (Object Sender, EventArgs e), dans System .Web.UI.TemplateControl.OnError (EventArgs e) à System.Web.UI.Page.HandleError (Exception e) à System.Web.UI.Page.ProcessRequestMain (booléen includeStagesBeforeAsyncPoint, Boolean includeStagesActiveSyncPoint) à System.a. Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) à System.Web.UI.Page.ProcessRequest () à System.Web.A sur ASP.default_aspx.ProcessRequest (contexte HttpContext) sur 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 soit échec, soit ils annulé le.
Pour reproduire l'exception, essayez de le faire vous-même. Cependant, je ne connais aucun moyen de l'empêcher (sauf de 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 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 n'importe quelle demande pour toute ressource qui entraîne une réponse au client. En gros, 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 diverses mesures pour y remédier. Si vous envoyez manuellement quelque chose dans la réponse avec une Response.Write, Response.Flush, renvoyant des données à partir d'une méthode de service/page Web ou quelque chose de similaire, vous devriez alors vérifier vérifier Response.IsClientConnected avant d'envoyer la réponse. De même, si la réponse risque de prendre un certain temps ou si un traitement long du côté du serveur est requis, vérifiez-le périodiquement jusqu'à ce que le fichier 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
Sinon, ce qui, à mon avis, est le plus probable dans votre cas, l’erreur est due à quelque chose à l’intérieur du cadre. Le lien suivant peut être utile:
Le poste de débordement de pile suivant peut également être intéressant:
"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();
}
Maintenant, lancez le site Web en mode débogage. Placez un point d'arrêt dans la boucle qui écrit dans le flux de sortie. Accédez à cette méthode d'action et après la première itération, 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 dynamiquement les données d'un WebRequest
et que je n'ai jamais fermé le Response
.
protected System.IO.Stream GetStream(string 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 parce que cela gâchait le processus de connexion. L'utilisateur se connecterait et obtiendrait un fichier 302 dans default.asxp, qui passerait par page_load, mais pas autant que le pré-rendu avant qu'iis7 n'envoie un 302 à login.aspx sans le cookie d'authentification. J'ai commencé à jouer avec les paramètres du pool d'applications et, pour une raison quelconque, "activer les applications 32 bits" semble avoir résolu le problème. Aucune idée pourquoi, puisque ce site ne fait rien de spécial qui devrait nécessiter des pilotes 32 bits. Certains sites utilisent encore Access avec 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 intense, a réussi à le reproduire aussi. Vous l'obtenez lorsqu'un utilisateur annule la demande (ferme la page ou si sa connexion Internet est interrompue, par exemple), dans mon cas à la ligne suivante:
myContext.Response.OutputStream.Write(buffer, 0, bytesRead);
Je ne vois aucun moyen de l’empêcher, mais vous pourrez peut-être 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..
}