Zdalny host zamknął połączenie. Kod błędu to 0x800704CD

81

Za każdym razem, gdy wystąpi wyjątek, otrzymuję wiadomości e-mail z błędami z mojej witryny. Otrzymuję ten błąd:

Zdalny host zamknął połączenie. Kod błędu to 0x800704CD

i nie wiem dlaczego. Dostaję około 30 dziennie. Nie mogę również odtworzyć błędu, więc nie mogę wyśledzić problemu.

Witryna internetowa to ASP.NET 2 działająca w usługach IIS7.

Ślad stosu:

at System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError (wynik Int32, Boolean throwOnDisconnect) at System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush () w System.Web.HttpResponse.Flush (BoolpushOnResponse.Flush) ) w System.Web.HttpResponse.End () w System.Web.UI.HttpResponseWrapper.System.Web.UI.IHttpResponse.End () w System.Web.UI.PageRequestManager.OnPageError (Object sender, EventArgs e) w System .Web.UI.TemplateControl.OnError (EventArgs e) w System.Web.UI.Page.HandleError (Exception e) w System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) w System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) w System.Web.UI.Page.ProcessRequest () w System.Web.UI.Page.ProcessRequestWithNoAssert (kontekst HttpContext) w System.Web.UI.Page.ProcessRequest (kontekst HttpContext) w ASP.default_aspx.ProcessRequest (kontekst HttpContext) w System.Web.HttpApplication.CallHandler.WecutionStep.System. IExecutionStep.Execute () w System.Web.HttpApplication.ExecuteStep (krok IExecutionStep, wartość logiczna i zakończonaSynchronicznie)

webnoob
źródło

Odpowiedzi:

60

Dostaję to cały czas. Oznacza to, że użytkownik rozpoczął pobieranie pliku, a następnie albo się nie udało , albo anulował .

Aby odtworzyć wyjątek, zrób to sam - jednak nie znam żadnych sposobów, aby temu zapobiec (z wyjątkiem obsługi tylko tego konkretnego wyjątku).

Musisz zdecydować, jaka będzie najlepsza droga w zależności od Twojej aplikacji.

m.edmondson
źródło
Nie oferuję żadnych plików do pobrania w mojej witrynie. Czy pobranie zawartości strony również by to spowodowało?
webnoob,
7
Tak, patrząc na ślad stosu System.Web.HttpResponse.Flush()oznacza jakąkolwiek odpowiedź. Właśnie to znalazłem , może to pomóc w znalezieniu trasy problemu, w którym stan widoku jest bardzo duży, a użytkownicy klikają zbyt szybko, co może powodować ten wyjątek.
m.edmondson
Czy wiesz, czy powoduje to błąd dla użytkownika, czy tylko ukryty?
webnoob,
2
Moje własne badania w tej sprawie pokazują, że użytkownicy nie widzą nic niezwykłego. Czy miałeś jakieś skargi od klientów / klientów?
m.edmondson,
2
Nie, nic. Dzięki za pomoc.
webnoob
30

Jak wspomniał m.edmondson: „Zdalny host zamknął połączenie”. występuje, gdy użytkownik lub przeglądarka anuluje coś lub połączenie sieciowe zostaje przerwane itp. Nie musi to być koniecznie pobranie pliku, jednak po prostu żądanie dowolnego zasobu, które skutkuje odpowiedzią klienta. Zasadniczo błąd oznacza, że ​​nie można wysłać odpowiedzi, ponieważ serwer nie może już rozmawiać z klientem (przeglądarką).

Istnieje kilka kroków, które możesz podjąć, aby temu zapobiec. Jeśli ręcznie wysyłasz coś w odpowiedzi za pomocą Response.Write, Response.Flush, zwracając dane z metody usługi sieciowej / strony lub czegoś podobnego, powinieneś rozważyć sprawdzenie Response.IsClientConnected przed wysłaniem odpowiedzi. Ponadto, jeśli odpowiedź może zająć dużo czasu lub wymagane jest dużo przetwarzania po stronie serwera, należy to okresowo sprawdzać, aż do wywołania response.end. Szczegółowe informacje na temat tej nieruchomości można znaleźć poniżej:

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

Alternatywnie, co moim zdaniem jest najprawdopodobniej w twoim przypadku, błąd jest spowodowany przez coś wewnątrz frameworka. Poniższy link może skorzystać z:

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

Poniższy post dotyczący przepełnienia stosu może również być interesujący:

„Zdalny host zamknął połączenie” w Response.OutputStream.Write

Sam Shiles
źródło
2
Wielkie ups Response.IsClientConnected!
Stumblor
10

Błąd można odtworzyć za pomocą poniższego kodu:

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();
} 

Teraz uruchom witrynę w trybie debugowania. Umieść punkt przerwania w pętli, która zapisuje w strumieniu wyjściowym. Przejdź do tej metody akcji i po pierwszej iteracji zamknij kartę przeglądarki. Naciśnij F10, aby kontynuować pętlę. Po przejściu do następnej iteracji zobaczysz wyjątek. Ciesz się swoim wyjątkiem :-)

Yaroslav Yakovlev
źródło
2

Otrzymywałem to w witrynie asp.net 2.0 iis7 Windows2008. Ten sam kod na iis6 działał dobrze. Był to dla mnie problem, ponieważ zakłócał proces logowania. Użytkownik logowałby się i otrzymywał 302 do default.asxp, który przeszedłby przez page_load, ale nie tak daleko, jak pre-render, zanim iis7 wyśle ​​302 z powrotem do login.aspx bez pliku cookie uwierzytelniania. Zacząłem bawić się ustawieniami puli aplikacji iz jakiegoś powodu `` włącz aplikacje 32-bitowe '' wydaje się to naprawić. Nie mam pojęcia dlaczego, ponieważ ta strona nie robi nic specjalnego, co wymagałoby jakichkolwiek 32-bitowych sterowników. Mamy kilka witryn, które nadal używają Access, które wymagają 32-bitowego, ale nie są to nasze zwykłe witryny SQL, takie jak ta.

Rich Wilson
źródło
Włączenie aplikacji 32-bitowych również rozwiązało problem. Dzięki !
Praneet Nadkar
Włączenie aplikacji 32-bitowej może spowodować, że aplikacja będzie zużywać mniej pamięci, co może wskazywać na problem z pamięcią na serwerze. Może to być również zupełnie inny problem.
jahu
2

Otrzymałem ten błąd, gdy dynamicznie odczytywałem dane z pliku WebRequesti nigdy nie zamykałem pliku 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;
    }
Clarice Bouwer
źródło
1

Ja też mam ten sam błąd w moim programie obsługi obrazów, który napisałem. Dostałem to jakieś 30 razy dziennie na miejscu o dużym natężeniu ruchu, udało mi się to również odtworzyć. Otrzymujesz to, gdy użytkownik anuluje żądanie (zamknie stronę lub na przykład jego połączenie internetowe zostanie przerwane), w moim przypadku w następującym wierszu:

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

Nie mogę wymyślić żadnego sposobu, aby temu zapobiec, ale może dasz radę sobie z tym właściwie. Dawny:

        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..
        }
Robert Benyi
źródło
4
To kończy się niepowodzeniem, gdy kultura serwera nie jest angielska (ponieważ wiadomość byłaby w innym języku). Po prostu użyj ErrorCodewłaściwości wyjątku (powinna wynosić 2147943629, HRESULT 0x800704CD).
Ronald,
4
Poprawka: ErrorCodedla HRESULT 0x800704CD jest -2147023667.
Ronald,
Nigdy nie korzystałem z kultury serwera innej niż angielska, ale widzę twój problem. Niemniej jednak możesz zmienić ten jeden wiersz kodu, aby obsługiwał różne kultury serwerów, takie jak ta, którą zasugerowałeś
Robert Benyi