【问题标题】:ASP web reference intermittently throwing 'an existing connection was forcibly closed by the remote host' exceptionASP Web 参考间歇性地抛出“现有连接被远程主机强行关闭”异常
【发布时间】:2014-07-28 20:51:13
【问题描述】:

我有一个 ASP.NET (VB.NET) Web 应用程序(面向 .NET 4 Framework),它在尝试通过以下方式调用 Web 方法时间歇性地抛出异常网络参考。 Web 参考是带有 .asmx 文件扩展名的老式 ASP.NET Web 服务

主 Web 应用程序和 Web 服务都在 IIS 7.5 / Windows 2008 SP1 上。在 IIS 中,两个应用程序都在同一个网站上,但在不同的应用程序池中。

异常状态为“现有连接被远程主机强行关闭”。这个错误很奇怪,因为它不会在调用 web 方法的前几次抛出异常。但是当错误被抛出时,它将继续在每个后续实例上抛出。在 IIS 中重新启动应用程序池可修复该错误。

传输的数据很少,所以我认为它与数据的大小无关。

最近我们安装了一个 F5 设备作为反向代理。 Web 服务现在在此设备后面运行。我们这样做是为了将应用程序移至 DMZ(非军事区)。这可能是导致此问题的原因,但如果是我不确定如何正确配置它。

这是我的代码:

_webService = New BWebService.BWebService()
_webService.Url = EnvironmentSettingsLocator.Settings.BWebServiceWsdl
If Not _webService.IsExistingUser(userId) Then 
' Do Something
end if

这是一个例外:

底层连接已关闭:接收时发生意外错误。

    at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at Apex3Web.BIRVWebService.BIRVWebService.IsExistingUser(Int32 userCode) in C:\Users\Ryan.DeFour.ctr\Documents\Work\TFS Source Code 2010\APEX4CMMI\APEXDevelopment\Apex3Web\Apex3Web\Web References\BIRVWebService\Reference.vb:line 501
   at Apex3Web.ManageExaminee.GridViewExaminees_RowDataBound(Object sender, GridViewRowEventArgs e) in C:\Users\Ryan.DeFour.ctr\Documents\Work\TFS Source Code 2010\APEX4CMMI\APEXDevelopment\Apex3Web\Apex3Web\Forms\Examiner\ManageExaminee.aspx.vb:line 651
   at System.Web.UI.WebControls.GridView.OnRowDataBound(GridViewRowEventArgs e)
   at System.Web.UI.WebControls.GridView.CreateRow(Int32 rowIndex, Int32 dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState, Boolean dataBind, Object dataItem, DataControlField[] fields, TableRowCollection rows, PagedDataSource pagedDataSource)
   at System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding)
   at System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data)
   at System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data)
   at System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data)
   at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback)
   at System.Web.UI.WebControls.DataBoundControl.PerformSelect()
   at System.Web.UI.WebControls.BaseDataBoundControl.DataBind()
   at System.Web.UI.WebControls.GridView.DataBind()
   at Apex3Web.ManageExaminee.FindCommand_Click(Object sender, EventArgs e) in C:\Users\Ryan.DeFour.ctr\Documents\Work\TFS Source Code 2010\APEX4CMMI\APEXDevelopment\Apex3Web\Apex3Web\Forms\Examiner\ManageExaminee.aspx.vb:line 539
   at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
   at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

无法从传输连接读取数据:现有连接被远程主机强行关闭。

    at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.Security._SslStream.StartFrameHeader(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security._SslStream.StartReading(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security._SslStream.ProcessRead(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.TlsStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)

现有连接被远程主机强行关闭

at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)

【问题讨论】:

  • 远程主机是否有未设置为您需要的超时设置?
  • 嗯......必须有东西来承载端点,对吧?那东西很可能有一个超时设置。基本上,您的错误意味着远程主机在您的网络应用程序完成之前关闭了连接,导致您的网络应用程序出错。这可能是由于远程主机上的超时。发生这种情况的另一个原因是连接不稳定。尝试在远程主机上执行 ping -t 并查看是否有任何数据包丢失。您是否有机会访问远程主机?
  • 我在远程主机的 web.config 中找到了这个:
  • 是的,我可以访问此服务器。如果请求超时,是否会在远程主机上抛出异常?
  • 不一定是异常,但应该可以在应用程序下的windows事件日志中看到关闭的连接。此外,如果您可以访问该服务器上的 IIS 应该有一个超时属性,请尝试提高它。看看这两个线程以尝试其他事情:stackoverflow.com/questions/2862817/…stackoverflow.com/questions/9117628/…

标签: asp.net vb.net dmz


【解决方案1】:

问题的根源是新安装的具有 SSL 负载平衡功能的 F5 BigIP 反向代理设备。应用程序在调用基于 SOAP 的服务(WCF 和 ASMX)期间引发异常。在与 F5 代表交谈时,我们能够正确配置设备,因此请求将简单地通过设备,而不是使用负载平衡功能。这可能不是最优雅的解决方案,但考虑到时间,这是我们必须做的才能实现它。

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    相关资源
    最近更新 更多