远程主机closures了连接。 错误代码是0x800704CD

每当发生exception时,我会收到来自我网站的错误电子邮件。 我得到这个错误:

远程主机closures了连接。 错误代码是0x800704CD

不知道为什么。 我每天大约30。 我也无法重现错误,所以无法追查到这个问题。

网站是在IIS7上运行的ASP.NET 2。

堆栈跟踪:

System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(Int32结果,布尔throwOnDisconnect)在System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()在System.Web.HttpResponse.Flush(布尔finalFlush)在System.Web.HttpResponse.Flush( )在System.Web.HttpResponse.End()在System.Web.UI.HttpResponseWrapper.System.Web.UI.IHttpResponse.End()在System.Web.UI.PageRequestManager.OnPageError(对象发件人,EventArgs e)在系统在System.Web.UI的System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)上的System.Web.UI.Page.HandleError(Exception e).Web.UI.TemplateControl.OnError(EventArgs e)。在System.Web.UI.Page.ProcessRequest()上System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext上下文)在System.Web.UI.Page.ProcessRequest(HttpContext上下文)页面处理请求(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)在System.Web.H的ASP.default_aspx.ProcessRequest(HttpContext上下文) ttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)

我一直得到这个。 这意味着用户开始下载一个文件,然后它失败了 ,或者他们取消了。

要重现exception请尝试自己做 – 但是我不知道任何方法来防止它(除了处理这个特定的例外)。

你需要决定什么是最好的方式取决于你的应用程序。

正如m.edmondson所说,“远程主机closures了连接”。 发生在用户或浏览器取消某些内容或networking连接丢失等情况下。不一定必须是文件下载,只是任何请求导致响应客户端的资源。 基本上这个错误意味着响应不能被发送,因为服务器不能再和客户端(浏览器)通话。

您可以采取一些步骤来阻止它的发生。 如果手动发送Response.Write,Response.Flush,从Web服务/页面方法或类似的东西返回数据,那么你应该考虑在发送响应之前检查Response.IsClientConnected。 另外,如果响应可能需要很长时间,或者需要大量的服务器端处理,则应该定期检查,直到调用response.end为止。 有关此属性的详情,请参阅以下内容:

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

或者,我认为最有可能的是你的情况,错误是由框架内的东西造成的。 以下连结可能会被使用:

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

下面的堆栈溢出post也可能是有趣的:

“远程主机closures连接”在Response.OutputStream.Write

可以用下面的代码重现错误:

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

现在以debugging模式运行网站。 在写入输出stream的循环中放置一个断点。 转到该操作方法,并在第一次迭代通过closures浏览器的选项卡后。 按F10继续循环。 在下一次迭代之后,您将看到exception。 享受你的例外:-)

我得到这个在asp.net 2.0 iis7 Windows2008网站上。 在iis6上的相同的代码工作正常。 这对我造成了一个问题,因为它搞乱了login过程。 用户将login并获得一个302到default.asxp,这将通过page_load,但没有达到预渲染之前,iis7将发送302返回到login.aspx没有auth cookie。 我开始使用应用程序池设置,出于某种原因,“启用32位应用程序”似乎已经解决了这个问题。 不知道为什么,因为这个网站没有做任何特殊的,应该需要任何32位驱动程序。 我们有一些仍然使用Access的站点需要32位,而不是像我们这样的直接SQL站点。

当我从WebRequestdynamic读取数据并从未closuresResponse时出现此错误。

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

我也在我的image processing程序上得到了同样的错误。 我每天在交通繁忙的地方得到了30次,并设法重现它。 当用户取消请求时(例如,closures页面或者他的互联网连接被中断),在我的情况下,如下所示:

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

我想不出有什么办法来阻止它,但也许你可以妥善处理这个问题。 例如:

  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.. }