“客户端已断开连接” ASP.NET 异常可能是由什么引起的?

33

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

客户端已断开连接

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


是否存在内部异常,例如:“无效的视图状态”和“Base-64 字符数组或字符串的长度无效”? - Krisztián Balla
6个回答

32

网站vbdork.net似乎已经关闭。搜索这个错误时,我发现了几篇有关的文章。我在谷歌缓存中找到了原始文章,并在此提供参考。原始URL是:http://vbdork.net/post/2009/02/10/The-client-disconnected.aspx

你会看到这个消息:客户端已断开连接。

如果您在Web农场中并且有一个允许用户进行多个选择的页面,那么很可能会偶尔出现此错误消息,通常在以下情况下会发生:

用户选择具有postback事件的下拉列表框,但在将请求发送回用户之前,用户再次执行此操作,现在用户正在创建另一个事件,该事件正在其他Web服务器上触发,以前的Web服务器尝试将旧事件的结果返回给用户,但是因为用户现在在其他Web服务器上,所以用户已经不在那里了。

用户永远不会看到错误,但是如果您捕获错误并通过电子邮件/日志记录它们,您将看到像下面所示的错误并感到完全沮丧。不用担心,只需忽略它,这甚至不是一个问题,只要您捕获了这种类型的错误,就不会出错。

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)

7
也许是因为“客户端断开连接”……关闭浏览器,导航到新页面,等待应用程序加载变得无聊……总之,请查看this page,了解有关该问题的大量信息。简而言之,这是由于浏览器在处理原始请求的同时发起新请求并跳转到第二个服务器。他的建议是简单地忽略它。我的建议是找出负载均衡器为什么不能在后续请求中将客户端固定在同一台服务器上,也称为“粘性”会话。

我对我们的负载均衡器有些怀疑,我们发现其他应用程序在用户不保留会话变量方面存在问题。 - Michael Kniskern
1
请注意:请查看Paul Prewett的答案。我提供的链接是相同的,但他从该页面中恢复了文本。 - NotMe
1
链接已失效,但我仍然在使用ASP.NET遇到了这个问题。 - Piotr Kula

4

此外,请查看这个类似问题的答案。在那种情况下没有Web农场。

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

感谢Russell Clarvoe


4
如果您正在使用Telerik组件,请摒弃RadCompression模块。

1
你能提供任何参考文章吗? - Nilesh Thakkar

1
尝试通过在web.config中使用maxPageStateFieldLength将视图状态分块成多个字段来修复:
<pages enableSessionState="true" enableViewState="true" enableViewStateMac="true" validateRequest="false" maxPageStateFieldLength="20">

在<Page>标签中添加了maxPageStateFieldLength="50",这对我起作用了。 - Khushboo Tahir

0
其他可能的原因: 您正在使用实际上不支持Ajax的控件。 Ajax应该能够处理异步请求,但某些控件无法正常工作,例如telerik(ajax)树形视图。 (等待telerik网络警察像往常一样审查这个不良宣传。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接