使用web服务时出错:已强制关闭现有连接
本文关键字:连接 服务 web 出错 使用 | 更新日期: 2023-09-27 18:22:11
我有一个用C#编写的Winforms应用程序,它使用来自Windows 2008 IIS Coldfusion服务器的web服务。所有的web服务调用都成功了,只有一个调用失败,大约50%的时间失败,并出现以下错误:
用户代码未处理System.InvalidOperationException消息=XML文档(1254,7)中存在错误。
内部例外:
InnerException:System.IO.IOException消息=无法从传输连接读取数据:远程主机强制关闭了现有连接。
我检查了IIS日志,得到503错误(服务不可用)和IIS代码64(指定的网络不再可用)。任何建议都很好。
我在SOAP UI中运行web服务,并得到以下错误:
javax.net.ssl.SSLException:连接已关闭:javax.net.sesl.SSLException:java.net.SocketException:连接重置
这段代码在一家公司运行良好,但在我目前工作的这家公司,几乎每次都会出现这个错误。
我不确定这是否适用于OP的具体情况,但这可能会帮助现在到达这里的其他人。此异常的一个潜在原因涉及不匹配的安全协议。如果您调用的服务器需要TLS 1.2,并且您使用的是旧版本的ASP.net(<=4.0版),则除非您更改它,否则您将使用旧的安全协议进行呼叫。您可以强制ASP.net使用TLS 1.2(如下所示)。这可以在应用程序的任何地方完成,但我把它放在调用需要TLS 1.2:的web服务的行之前
using System.Net;
...
//Enable TLS 1.2
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
// Call the Web Service that requires TLS 1.2
我最近在使用WCF Web服务时收到了类似的消息。就我而言,情况发生了变化结果是服务器端的配置错误。也许有些配置不同在发生这种情况的一台服务器上?我的问题是默认的最大邮件大小被配置为太小这导致了相同的强制连接关闭。存在默认值避免DOS攻击的最大消息大小。。。
如果您使用WCF客户端连接到服务,请使用以下配置在客户端应用程序中启用服务跟踪日志记录:
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.ServiceModel"
switchValue="Error"
propagateActivity="true">
<listeners>
<add name="sdt"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "ErrorTrace.svclog"
/>
</listeners>
</source>
</sources>
</system.diagnostics>
下载windowssdk,就可以为这些日志文件提供一个很好的跟踪查看器。它可以帮助您弄清WCF通信中的错误。
使用跨平台通信有时会发生(一旦发生在我的代码中)抛出的异常并不是内部发生的事情的真实描述。
导致此异常的一个原因是您的响应时间比webservice方法完成所需的时间稍短。因此,请尝试在app.config中增加超时。
如果它不起作用,你的情况可能会有两个问题。
- 如果使用SSL,则SSL证书的有效性存在问题
- XML中使用了一些无效字符,例如,您的平台不支持Unicode字符,XML中也使用了一些不受支持的字符
但我希望只要增加超时时间就能解决这个问题。
我确实收到了类似的错误,原因是XML序列化中出现异常。大多数情况下,如果xmlserializer试图读取某些属性,而get方法由于某些数据库连接已关闭或任何资源不可用而引发异常。
您是否尝试在global.asax中的错误事件中记录异常?
有时,若global.asax并没有引发错误事件,那个么通过响应过滤器记录错误的唯一方法。您可以在web.config中添加自定义响应筛选器,在该筛选器中,您将能够分析有多少XML被正确序列化,以及它可能在哪里失败。
http://msdn.microsoft.com/en-us/library/aa479332.aspx
http://www.raboof.com/projects/elmah/
中间"远程主机强制关闭了现有连接",仅从一个目的地开始,这听起来像是网络问题。
尝试从您尝试访问的服务器以及两个位置的相关防火墙获取日志。您可以运行Fiddler或NetMon/WireShark/Ethereal进行进一步诊断。
任何情况下都会发生连接关闭。确保服务器和客户端的超时时间充足,确保返回的数据中没有递归。循环引用。在这种情况下,序列化很重要,因为返回时正在序列化。
做一个WCF跟踪程序并检查那里的答案。服务器中的任何故障都将关闭连接。如果服务器需要用户名,请确保用户名正确无误。请注意SSL错误。使用WCF客户端测试服务。
这可能是在黑暗中拍摄的,但这是我的理论:
第一个错误发生在web服务端,抛出了一个糟糕的异常,也许一些无效数据正在传递到服务中?这可能会返回有关XML格式错误的错误。我会做几个测试案例,看看哪些数据被传递到服务中,以及是什么导致了这个问题。
我以前在某个特定情况下看到的第二个错误是抛出web服务异常,并将try-catch包裹在服务的using语句中。这种逻辑组合导致了一个没有清理的早期退出。
尝试检查上一家公司的现有协议,并将其与当前公司进行比较,我的意思是TCP/Ip,。。。
检查IIS中的应用程序池回收配置。我看到过这个错误,例如,当"专用内存限制"设置为一个值(比如100mb),然后w3wp进程超过了这个限制,这将导致应用程序池被回收。
这通常不是问题,因为任何现有连接都有时间完成,新连接将由新启动的应用程序池处理。
如果所有连接都没有在关闭时间限制内(通常为90秒)关闭,则它们将被IIS终止,客户端可能会引发"现有连接已强制关闭"错误。