使用 Web 服务时出错:现有连接被强行关闭
Posted
技术标签:
【中文标题】使用 Web 服务时出错:现有连接被强行关闭【英文标题】:Error consuming web service: An existing connection was forcibly closed 【发布时间】:2012-02-02 18:13:39 【问题描述】:我有一个用 C# 编写的 Winforms 应用程序,它使用来自 Windows 2008 IIS Coldfusion 服务器的 Web 服务。所有 Web 服务调用都成功,但只有一个调用失败,大约 50% 的时间失败并出现以下错误:
System.InvalidOperationException 未被用户代码处理 Message=XML 文档中存在错误 (1254, 7)。
内部例外:
内部异常:System.IO.IOException Message=无法从传输连接读取数据:现有连接被远程主机强行关闭。
我检查了我的 IIS 日志,发现 503 错误(服务不可用)和 IIS 代码 64(指定的网络不再可用)。任何建议都会很棒。
我在 SOAP UI 中运行我的 Web 服务并收到以下错误:
javax.net.ssl.SSLException:连接已关闭:javax.net.ssl.SSLException:java.net.SocketException:连接重置
此代码在一家公司运行良好,但对于我目前正在与之合作的这家公司,几乎每次都会弹出此错误。
【问题讨论】:
检查 Windows 事件日志,尤其是应用程序日志。顺便说一句,服务是在 Coldfusion 中编写的吗? 事件日志中没有与此问题相关的错误或任何其他内容。这些服务是用 Coldfusion 编写的。 您联系过网络服务供应商吗?这听起来像是一个问题,不一定在消费应用程序中。 我写了服务器端和消费者端。我已在多个位置成功部署它。这只是我最近安装它的一个位置给我带来了这个问题。 我遇到了同样的问题 【参考方案1】:我不确定这是否适用于 OP 的具体情况,但这可能会对现在到达这里的其他人有所帮助。此异常的一个潜在原因涉及不匹配的安全协议。如果您调用的服务器需要 TLS 1.2 并且您使用的是旧版本的 ASP.net(
using System.Net;
...
//Enable TLS 1.2
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
// Call the Web Service that requires TLS 1.2
【讨论】:
【参考方案2】:我最近在使用 WCF-Webservice 时收到了类似的消息。就我而言,它变成了 是服务器端的配置错误。也许有些东西配置不同 在您发生这种情况的一台服务器上? 我的问题是默认的最大消息大小配置得太小 在服务器上,这导致相同的强制连接关闭。有一个默认值 避免 DOS 攻击的最大消息大小...
【讨论】:
【参考方案3】:如果您使用 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>
下载 windows sdk,您就有了一个很好的跟踪查看器来查看这些日志文件。它可以帮助您深入了解 WCF 通信中的错误。
【讨论】:
不幸的是,我使用的是 WinForms(这是一个较旧的程序)。 WinForms 是否有任何跟踪功能? 您仍然可以在 winforms 中使用 WCF 客户端 - 如果您使用的是 .NET 3.0 或更高版本。【参考方案4】:使用跨平台通信有时会发生(曾经发生在我的代码中)抛出的异常并不是对内部发生的事情的真实描述。
此异常的一个原因是您的响应时间比 webservice 方法完成所需的时间稍短。因此,请尝试增加 app.config 中的超时时间。
如果它不起作用,您的情况可能有两个问题。
-
如果使用 SSL,则 SSL 证书有效性存在问题。
XML 中使用了一些无效字符,例如您的平台不支持 Unicode 字符,并且 XML 中使用了一些不受支持的字符。
但我希望只是增加超时时间就能解决这个问题。
【讨论】:
【参考方案5】:我确实得到了类似的错误,原因是 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/
【讨论】:
什么是 global.asax?这不是 ASP.net 程序。我将如何向 web.config 添加自定义响应过滤器?【参考方案6】:仅来自一个目的地的中间“现有连接被远程主机强行关闭”对我来说听起来像是网络问题。
尝试从您尝试访问的服务器和两个位置的相关防火墙获取日志。 您可以运行Fiddler 或NetMon / WireShark / Ethereal 进行进一步诊断。
【讨论】:
【参考方案7】:在任何情况下都会发生连接关闭。确保服务器和客户端的超时时间充足,确保您返回的数据中没有递归。循环参考。在这种情况下,序列化很重要,因为返回时正在序列化。
做一个 WCF 跟踪器并在那里检查答案。服务器中的任何故障都会关闭连接。如果服务器需要用户名,请确保这些是正确的。注意 SSL 错误。使用 WCF 客户端测试服务。
【讨论】:
【参考方案8】:这可能是在黑暗中拍摄,但这是我的理论:
第一个错误发生在 Web 服务端,抛出了一个很差的异常,也许一些无效数据正在传递到服务中?这可能会返回有关 XML 格式错误的错误。我会做几个测试用例来查看哪些数据被传递到服务中以及导致问题的原因。
我之前在特定情况下看到的第二个错误是关于引发 Web 服务异常以及围绕服务的 using 语句的 try catch。这种逻辑组合导致未清理的提前退出。
【讨论】:
【参考方案9】:尝试检查你上一家公司的现有协议,并与你现在的公司进行比较,我是说 TCP/Ip,...
【讨论】:
【参考方案10】:检查 IIS 中的应用程序池回收配置。我见过这个错误,例如,当“私人内存限制”设置为一个值(比如 100mb)然后 w3wp 进程超过这个限制,这将导致应用程序池被回收。
这通常不是问题,因为任何现有连接都有时间完成,新连接将由新启动的应用程序池处理。
如果所有连接都没有在关闭时间限制内(通常为 90 秒)关闭,那么它们会被 IIS 杀死,并且客户端可能会引发“现有连接被强制关闭”错误。
【讨论】:
以上是关于使用 Web 服务时出错:现有连接被强行关闭的主要内容,如果未能解决你的问题,请参考以下文章
Azure Blob 存储异常“现有连接被远程主机强行关闭”