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


80

每当发生异常时,我都会从我的网站收到错误电子邮件。我收到此错误:

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

而且不知道为什么。我一天大约30点。我也无法重现该错误,因此也无法找到问题所在。

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

堆栈跟踪:

在System.Web.HttpResponse.Flush(Boolean finalFlush)在System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush()处System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(Int32结果,布尔throwOnDisconnect) )在System.Web.UI.HttpResponseWrapper.System.Web.UI.IHttpResponse.End()在System.Web.UI.PageRequestManager.OnPageError(Object sender,EventArgs e)在System.Web.UI.HttpResponse。 System.Web.UI.Page.HandleError(Exception e)处于System.Web.UI.Page.ProcessRequestMain处的.Web.UI.TemplateControl.OnError(EventArgs e)(System.Web.UI处的Boolean includeStagesBeforeAsyncPoint,布尔值includeStagesAfterAsyncPoint)。 System.System.Web.UI.Page.ProcessRequest()的Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)。System.Web.UI.Page.ProcessRequest(HttpContext上下文)处的Web.UI.Page.ProcessRequestWithNoAssert(HttpContext上下文)在System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication处的ASP.default_aspx.ProcessRequest(HttpContext上下文)处。 System.Web.HttpApplication.ExecuteStep上的IExecutionStep.Execute()(IExecutionStep步骤,布尔值和完成完成)

Answers:


60

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

要重现该异常,请自己尝试进行操作-但是,我不知道有什么方法可以阻止该异常(仅处理此特定异常除外)。

您需要确定哪种最佳方式取决于您的应用程序。


我的网站上不提供任何文件下载。下载页面内容也会导致它吗?
webnoob 2011年

6
是的,查看堆栈跟踪System.Web.HttpResponse.Flush()意味着任何形式的响应。我刚刚发现了这个问题,它可以帮助您解决viewstate很大且用户单击得太快而可能导致此异常的问题。
m.edmondson 2011年

您是否知道这会给用户带来错误还是只是一个隐藏的错误?
webnoob 2011年

2
我对此的调查表明,用户看不到任何异常。您是否有来自客户/客户的投诉?
m.edmondson 2011年

2
不,没有 谢谢您的帮助。
webnoob 2011年

30

正如m.edmondson所说:“远程主机关闭了连接。” 当用户或浏览器取消某项操作或网络连接断开等情况时发生。它不一定必须是文件下载,而仅仅是对任何资源的任何请求都会导致对客户端的响应。基本上,该错误意味着无法发送响应,因为服务器无法再与客户端(浏览器)对话。

您可以采取许多步骤来阻止这种情况的发生。如果要通过Response.Write,Response.Flush,从Web服务/页面方法返回数据或类似方法手动在响应中发送内容,则应考虑在发送响应之前检查Response.IsClientConnected。另外,如果响应可能需要很长时间或需要大量服务器端处理,则应定期检查此响应,直到调用response.end为止。有关此属性的详细信息,请参见以下内容:

http://msdn.microsoft.com/zh-CN/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

以下堆栈溢出的帖子可能也很有趣:

Response.OutputStream.Write中的“远程主机关闭连接”


2
大起大落了Response.IsClientConnected
Stumblor '16

10

可以使用以下代码重现该错误:

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

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


2

我是在asp.net 2.0 iis7 Windows2008站点上获得的。iis6上的相同代码工作正常。这给我造成了一个问题,因为它搞砸了登录过程。用户将登录并获得一个default.asxp 302,该文件将通过page_load进行访问,但是在iis7将302发送回login.aspx且没有auth cookie之前,不及预渲染。我开始使用应用程序池设置,由于某种原因,“启用32位应用程序”似乎已对其进行了修复。不知道为什么,因为这个站点没有做任何特别的事情,所以不需要任何32位驱动程序。我们有些站点仍在使用需要32位的Access,但没有像这样的直接SQL站点。


启用32位应用程序也为我修复了该问题。谢谢 !
Praneet Nadkar '19

启用32位应用程序可能会导致应用程序使用较少的内存,这可能表明服务器上存在内存问题。这也可能是完全不同的问题。
jahu

2

当我动态地从读取数据WebRequest并且从未关闭时,出现此错误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;
    }

1

我在图像处理程序上也遇到了同样的错误。我每天在繁忙的网站上获得30次访问,并设法复制它。当用户取消请求(例如关闭页面或他的互联网连接中断)时,您会收到此消息,在我的情况下,此行如下:

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

4
当服务器区域性不是英语(因为消息将使用另一种语言)时,此操作将失败。只需使用ErrorCode异常的属性即可(应该等于2147943629,HRESULT 0x800704CD)。
罗纳德

4
更正:ErrorCode对于HRESULT 0x800704CD是-2147023667
罗纳德

我从未使用过非英语服务器文化,但我看到了您的问题。不管怎样,您可以更改一行代码来处理不同的服务器文化,就像您建议的那样
Robert Benyi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.