什么可能导致“客户端断开连接”ASP.NET 异常?

Posted

技术标签:

【中文标题】什么可能导致“客户端断开连接”ASP.NET 异常?【英文标题】:What might be causing the "The client disconnected" ASP.NET exception? 【发布时间】:2010-10-23 00:06:54 【问题描述】:

我的 .NET 3.5 应用程序偶尔会抛出以下异常 System.Web 异常:

客户端断开连接

为什么会出现这个异常?我的应用程序在负载平衡的 Windows Server 2003 IIS 6.0 服务器上运行。

【问题讨论】:

是否存在内部异常,例如:“无效的视图状态”。和“Base-64 字符数组或字符串的长度无效。”? 【参考方案1】:

vbdork.net 域现在似乎已失效。在搜索这个错误时,我发现了这篇文章的几个参考。所以我找到了它的谷歌缓存版本,现在将其发布在这里以供参考。原来的网址是:http://vbdork.net/post/2009/02/10/The-client-disconnected.aspx

您会收到消息客户端已断开连接。

如果您在网络场中并且有一个用户可以进行多项选择的页面,您可能会偶尔收到此错误消息,这通常发生在这种情况下:

用户选择了一个下拉列表框,该下拉列表框在回发时有一个事件,但用户在将请求发送回用户之前再次执行此操作,用户现在正在创建第二个事件,该事件正在另一个网络服务器上触发,之前的网络服务器尝试将旧事件的结果返回给用户,但用户不再存在,因为用户现在在另一个网络服务器上。

用户永远不会看到错误,但如果您发现错误并通过电子邮件发送/记录它们,您会看到如下所示的错误并感到非常沮丧。不用担心,忽略它甚至都不是问题,只要您捕获这种错误就不会出错。

Type : System.Web.HttpException, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Message : The client disconnected.
Source : System.Web
Help link :
ErrorCode : -2147467259
Data : System.Collections.ListDictionaryInternal
TargetSite : Void ThrowError(System.Exception, System.String, System.String, Boolean)
Stack Trace :    at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError)
           at System.Web.UI.HiddenFieldPageStatePersister.Load()
           at System.Web.UI.Page.LoadPageStateFromPersistenceMedium()
           at System.Web.UI.Page.LoadAllState()
           at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
           at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
           at System.Web.UI.Page.ProcessRequest()
           at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
           at System.Web.UI.Page.ProcessRequest(HttpContext context)
           at ASP.src_rptprefs_chainhierarchy_aspx.ProcessRequest(HttpContext context)
           at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
           at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

        Inner Exception
        ---------------
        Type : System.Web.UI.ViewStateException, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
        Message : Invalid viewstate.

Client IP: 10.21.4.8
Port: 46784
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; InfoPath.1; .NET CLR 1.1.4322; MS-RTC LM 8)

【讨论】:

【参考方案2】:

也许是因为“客户端断开连接”...

关闭浏览器,导航到新页面,厌倦了等待应用加载...

说真的,请查看this page 以获取有关该问题的大量信息。

总而言之,这是因为浏览器正在发起一个新请求,该请求在第一台服务器处理原始请求时反弹到第二台服务器。他的建议是直接忽略它。

我的建议是弄清楚为什么您的负载均衡器没有在后续请求中将客户端固定在同一台服务器上;也称为“粘性”会话。

【讨论】:

我怀疑我们的负载均衡器,我们发现其他应用程序中存在无法为用户保留会话变量的问题。 注意:见 Paul Prewett 的回答。我的链接是一样的;然而,他复活了那个页面上的文字。 链接已失效.. 但我仍然在使用 ASP.NEt 时遇到此问题【参考方案3】:

如果您使用 Telerik 组件,请摆脱 RadCompression 模块。

【讨论】:

能否提供参考文章?【参考方案4】:

还可以查看this answer 的类似问题。在这种情况下没有网络农场。

ViewState 变得“大”并且用户在前一个请求完成之前单击按钮时,将引发此异常。 [...] 这很容易发生,因为回发使用的是 ajax,因此在将 ViewState 发送到服务器时浏览器不会停止响应。

感谢Russell Clarvoe

【讨论】:

【参考方案5】:

尝试通过在 web.config 中使用 maxPageStateFieldLength 将视图状态分块为多个字段来修复:

<pages enableSessionState="true" enableViewState="true" enableViewStateMac="true" validateRequest="false" maxPageStateFieldLength="20">

【讨论】:

在适合我的 标签中添加了 maxPageStateFieldLength="50"【参考方案6】:

其他可能的原因: 您使用的控件实际上不支持 Ajax。 Ajax 应该能够处理异步请求,但是某些控件不起作用,例如 Telerik (ajax) 树视图。 (像往常一样,等待 Telerik 互联网警察来审查这种不良宣传。)

【讨论】:

以上是关于什么可能导致“客户端断开连接”ASP.NET 异常?的主要内容,如果未能解决你的问题,请参考以下文章

当客户端断开连接而不取消连接时,Websocket.ReceiveAsync 导致崩溃

asp.net core 自定义异常处理中间件

客户端断开连接后在 .NET 4 中重用 NamedPipeServerStream 时 BeginWaitForConnection 引发的异常

C# 客户端 - 服务器套接字断开处理

在 ASP.NET 中调试时,啥可能导致 LocalHost 上的“连接中断”

如何避免 ASP.NET MVC 中的 HttpRequestValidationException 呈现导致异常的相同视图