使用Web服务时出错:强制关闭现有连接

时间:2012-02-02 18:13:40

标签: c# web-services iis coldfusion

我有一个用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:连接重置

这个代码在一家公司工作正常,但这个错误几乎每次都出现在我正在与之合作的公司。

10 个答案:

答案 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中的超时。

如果它不起作用,您的情况可能会出现两个问题。

  1. 如果使用SSL,则SSL证书有效性存在问题。
  2. XML中使用了一些无效字符,例如您的平台不支持Unicode字符,并且XML中使用了一些不受支持的字符。
  3. 但我希望只是增加超时就可以解决这个问题。

答案 4 :(得分:0)

我确实得到了类似的错误,并且在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/

答案 5 :(得分:0)

中级“现有连接被远程主机强行关闭”只来自一个目的地听起来像是一个网络问题。

尝试从您尝试访问的服务器以及两个位置的相关防火墙中获取日志。 您可以运行FiddlerNetMon / 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杀死,客户端可能会引发“强制关闭现有连接”错误。