每当发生异常时,我都会收到来自我网站的错误电子邮件。我收到了这个错误:
远程主机关闭了连接。错误代码是0x800704CD
并且不知道为什么。我每天大约30。我无法重现错误,因此无法追踪问题。
网站是在IIS7上运行的ASP.NET 2.
堆栈追踪:
在 System.Web.Hosting.IIS7WorkerRequest.RaiseCommunicationError(的Int32 结果,布尔throwOnDisconnect)at System.Web.Hosting.IIS7WorkerRequest.ExplicitFlush() 在 System.Web.HttpResponse.Flush(布尔 finalFlush)at System.Web.HttpResponse.Flush()at System.Web.HttpResponse.End()at System.Web.UI.HttpResponseWrapper.System.Web.UI.IHttpResponse.End() 在 System.Web.UI.PageRequestManager.OnPageError(对象 发件人,EventArgs e)at System.Web.UI.TemplateControl.OnError(EventArgs的 吃 System.Web.UI.Page.HandleError(例外 吃 System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)at System.Web.UI.Page.ProcessRequest(布尔 includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)at System.Web.UI.Page.ProcessRequest()at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext的 上下文) System.Web.UI.Page.ProcessRequest(HttpContext的 上下文) ASP.default_aspx.ProcessRequest(HttpContext的 上下文) System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步,布尔& completedSynchronously)
答案 0 :(得分:57)
我总是得到这个。这意味着用户开始下载文件,然后失败,或取消。
要重现异常,请尝试自己动手 - 但是我不知道有任何方法可以阻止它(除了仅处理此特定异常)。
您需要根据自己的应用确定最佳前进方式。
答案 1 :(得分:27)
作为m.edmondson mentioned,“远程主机关闭了连接。”当用户或浏览器取消某些内容或网络连接丢失等时发生。但它不一定必须是文件下载,只是对任何导致客户端响应的资源的任何请求。基本上,错误意味着无法发送响应,因为服务器无法再与客户端(浏览器)通信。
您可以采取许多步骤来阻止它发生。如果您使用Response.Write,Response.Flush在响应中手动发送内容,从Web服务/页面方法或类似方法返回数据,则应在发送响应之前考虑检查Response.IsClientConnected。此外,如果响应可能需要很长时间,或者需要进行大量的服务器端处理,则应定期检查,直到response.end(如果调用)。有关此属性的详细信息,请参阅以下内容:
http://msdn.microsoft.com/en-us/library/system.web.httpresponse.isclientconnected.aspx
或者,我认为最有可能在您的情况下,错误是由框架内的东西引起的。以下链接可能有用:
以下堆栈溢出帖子也可能很有用:
"The remote host closed the connection" in Response.OutputStream.Write
答案 2 :(得分:9)
可以使用以下代码重现错误:
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继续循环。在达到下一次迭代后,您将看到异常。享受你的例外: - )
答案 3 :(得分:2)
我在asp.net 2.0 iis7 Windows2008网站上得到了这个。 iis6上的相同代码工作正常。它给我带来了一个问题,因为它弄乱了登录过程。用户将登录并获得302到default.asxp,这将通过page_load,但不是预渲染,直到iis7将302返回到login.aspx而没有auth cookie。我开始玩应用程序池设置,由于某种原因'启用32位应用程序'似乎已修复它。不知道为什么,因为这个网站没有做任何需要任何32位驱动程序的特殊功能。我们有一些网站仍然使用需要32位的Access,但不是像我这样的直接SQL网站。
答案 4 :(得分: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;
}
答案 5 :(得分: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..
}