我有一个用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.ssl.SSLException:java.net.SocketException:连接重置
这个代码在一家公司工作正常,但这个错误几乎每次都出现在我正在与之合作的公司。
答案 0 :(得分:3)
我最近在使用WCF-Webservice时得到了类似的消息。在我的情况下,它转向了 out是服务器端的配置错误。也许某些东西的配置不同 在一台服务器上发生这种情况? 我的问题是默认的最大邮件大小配置得太小 在服务器上,这导致相同的强制连接关闭。有一个默认值 最大消息大小,以避免DOS攻击...
答案 1 :(得分:2)
我不确定这是否适用于OP的具体情况,但这可能有助于现在到达这里的其他人。此异常的一个潜在原因涉及不匹配的安全协议。如果您正在调用的服务器需要TLS 1.2并且您使用的是旧版本的ASP.net(< = Version 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
答案 2 :(得分:1)
如果您使用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通信中的错误。
答案 3 :(得分:1)
使用跨平台通信有时会发生(一旦发生在我的代码中)抛出的异常并不是对内部情况的真实描述。
此异常的一个原因是您的响应时间略小于Web服务方法完成所需的时间。因此,请尝试增加app.config中的超时。
如果它不起作用,您的情况可能会出现两个问题。
但我希望只是增加超时就可以解决这个问题。
答案 4 :(得分:0)
我确实得到了类似的错误,并且在XML序列化中导致异常。大多数情况下,如果xmlserializer尝试读取某些属性,并且由于某些数据库连接已关闭或任何资源不可用,get方法会引发异常。
您是否尝试在global.asax中记录错误事件中的异常?
有时如果global.asax没有引发错误事件,那么只能通过响应过滤器记录错误。您可以在web.config中添加自定义响应过滤器,您可以在其中分析正确序列化的XML数量以及可能失败的位置。
答案 5 :(得分:0)
中级“现有连接被远程主机强行关闭”只来自一个目的地听起来像是一个网络问题。
尝试从您尝试访问的服务器以及两个位置的相关防火墙中获取日志。 您可以运行Fiddler或NetMon / WireShark / Ethereal进一步诊断。
答案 6 :(得分:0)
任何情况都会发生连接关闭。确保服务器和客户端上的超时很多,确保您返回的数据没有递归。循环参考。在这种情况下,序列化很重要,因为返回时序列化了。
执行WCF跟踪并检查答案。服务器中的任何故障都将关闭连接。如果服务器需要用户名,请确保它们是正确的。处理SSL错误。使用WCF客户端来测试服务。
答案 7 :(得分:0)
这可能是在黑暗中拍摄的,但这是我的理论:
第一个错误发生在Web服务端,抛出异常,可能是一些无效数据正在传入服务?这可能会返回有关XML格式错误的错误。我会做几个测试用例来查看传递给服务的数据以及导致问题的原因。
在某种情况下,我之前看到的第二个错误是关于抛出Web服务异常并且try catch包含在服务的using语句中。这种逻辑组合导致了早期退出,但没有清理。
答案 8 :(得分:0)
尝试检查上一家公司的现有协议并将其与当前公司进行比较,我的意思是TCP / IP,...
答案 9 :(得分:0)
检查IIS中的应用池回收配置。我已经看到了这个错误,例如,当“私有内存限制”设置为一个值(比如100mb),然后w3wp进程超过此限制,这将导致应用程序池被回收。
这通常不是问题,因为任何现有连接都有时间完成,新连接将由新启动的应用程序池处理。
如果所有连接都没有在关闭时间限制内关闭(通常为90秒),那么它们将被IIS杀死,客户端可能会引发“强制关闭现有连接”错误。