88 votes

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

Je reçois des courriels d'erreur de mon site Web dès 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. J'en reçois environ 30 par jour. Je ne peux pas non plus reproduire l'erreur et je ne peux donc pas trouver la cause du problème.

Le site Web est en ASP.NET 2 et fonctionne sur IIS7.

Trace de la pile :

à l'adresse System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(Int32 result, Boolean throwOnDisconnect) at System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush() à l'adresse System.Web.HttpResponse.Flush(Boolean finalFlush) at System.Web.HttpResponse.Flush() at System.Web.HttpResponse.End() at System.Web.UI.HttpResponseWrapper.System.Web.UI.IHttpResponse.End() at System.Web.UI.PageRequestManager.OnPageError(Object sender, EventArgs e) at System.Web.UI.TemplateControl.OnError(EventArgs e) at System.Web.UI.Page.HandleError(Exception e) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, booléen includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, booléen includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest() at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) à l'adresse System.Web.UI.Page.ProcessRequest(HttpContext context) at ASP.default_aspx.ProcessRequest(HttpContext context) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

62voto

m.edmondson Points 13514

Je reçois ce message tout le temps. Cela signifie que l'utilisateur a commencé à télécharger un fichier, et qu'il a soit échoué ou ils annulé il.

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

Vous devez décider de la meilleure façon de procéder en fonction de votre application.

0 votes

Je ne propose pas de téléchargement de fichiers sur mon site. Le téléchargement du contenu d'une page pourrait-il également causer ce problème ?

8 votes

Oui, en regardant la trace de la pile System.Web.HttpResponse.Flush() signifie toute sorte de réponse. J'ai juste trouvé ce Cela peut vous aider à trouver la source du problème : l'état d'affichage est très grand et les utilisateurs cliquent trop rapidement, ce qui peut provoquer cette exception.

0 votes

Savez-vous si cela produit une erreur pour l'utilisateur ou juste une erreur cachée ?

36voto

Sam Shiles Points 3254

Comme m.edmondson a mentionné Le message "L'hôte distant a fermé la connexion" se produit lorsqu'un utilisateur ou un navigateur annule la connexion. quelque chose ou la connexion réseau est interrompue, etc. Il ne s'agit pas nécessairement d'un téléchargement de fichier, mais de toute demande de ressource qui donne lieu à une réponse au client. En fait, l'erreur signifie que la réponse n'a pas pu être envoyée parce que le serveur ne peut plus communiquer avec le client (navigateur).

Il existe un certain nombre de mesures que vous pouvez prendre afin d'empêcher que cela ne se produise. Si vous envoyez manuellement quelque chose dans la réponse avec Response.Write, Response.Flush, en renvoyant des données à partir d'un service web ou d'une méthode de page ou quelque chose de similaire, vous devriez envisager de vérifier Response.IsClientConnected avant d'envoyer la réponse. De même, si la réponse est susceptible de prendre beaucoup de temps ou si un traitement côté serveur est nécessaire, vous devriez vérifier périodiquement cette propriété jusqu'à ce que Response.end soit appelé. Voir ce qui suit pour plus de détails sur cette propriété :

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

Ou bien, ce qui me semble le plus probable dans votre cas, l'erreur est causée par quelque chose à l'intérieur du framework. Le lien suivant peut vous être utile :

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

L'article suivant de stack-overflow pourrait également vous intéresser :

"L'hôte distant a fermé la connexion" dans Response.OutputStream.Write

4 votes

Un grand bravo pour le Response.IsClientConnected !

2voto

Rich Wilson Points 11

J'ai obtenu ce résultat sur un site asp.net 2.0 iis7 Windows2008. Le même code sur iis6 fonctionnait bien. Cela me posait un problème car cela perturbait le processus de connexion. L'utilisateur se connectait et recevait un 302 vers default.asxp, qui passait par le page_load, mais pas jusqu'au pre-render avant que iis7 ne renvoie un 302 vers 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églé le problème. Je ne sais pas pourquoi, puisque ce site ne fait rien de spécial qui nécessite des pilotes 32 bits. Nous avons quelques sites qui utilisent encore Access et qui ont besoin de 32 bits, mais pas nos sites SQL comme celui-ci.

0 votes

L'activation des applications 32 bits a également réglé le problème pour moi. Merci !

0 votes

L'activation de l'application 32 bits peut faire en sorte que l'application utilise moins de mémoire, ce qui peut indiquer qu'il y a un problème de mémoire sur le serveur. Il peut également s'agir d'un tout autre problème.

2voto

kleinkie Points 976

J'ai obtenu cette erreur lorsque j'ai lu dynamiquement des données à partir d'un fichier WebRequest et n'a 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;
    }

1voto

Robert Benyi Points 1

J'ai moi aussi obtenu cette même erreur sur le gestionnaire d'image que j'ai écrit. Je l'ai eu environ 30 fois par jour sur un site à fort trafic, j'ai réussi à le reproduire également. Vous obtenez ceci quand un utilisateur annule la requête (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 vois aucun moyen de l'empêcher, mais vous pouvez peut-être vous en occuper 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..
        }

4 votes

Cela échoue lamentablement lorsque la culture du serveur n'est pas l'anglais (puisque le message serait dans une autre langue). Utilisez simplement ErrorCode de l'exception (qui devrait être égale à 2147943629, HRESULT 0x800704CD).

4 votes

Correction : le ErrorCode pour HRESULT 0x800704CD est -2147023667 .

1 votes

Je n'ai jamais utilisé de culture de serveur non anglais, mais je vois votre problème. Néanmoins, vous pouvez modifier cette ligne de code pour gérer différentes cultures de serveur, comme vous l'avez suggéré.

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