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)
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.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
źródło
Response.IsClientConnected
!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 :-)
źródło
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.
źródło
Otrzymałem ten błąd, gdy dynamicznie odczytywałem dane z pliku
WebRequest
i nigdy nie zamykałem plikuResponse
.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; }
źródło
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.. }
źródło
ErrorCode
właściwości wyjątku (powinna wynosić 2147943629, HRESULT 0x800704CD).ErrorCode
dla HRESULT 0x800704CD jest-2147023667
.