【问题标题】:An existing connection was forcibly closed by the remote host - WCF远程主机强制关闭现有连接 - WCF
【发布时间】:2011-11-04 19:21:45
【问题描述】:

我有一个运行良好的 WCF Web 服务。但是,有一个特定的呼叫失败了——但仅对某些用户失败。这个调用非常简单——它是一个获取 Person 对象列表的调用。

对于用户 A,它工作正常。该服务查询数据库,创建 Person 对象列表并将其返回给调用应用程序。

对于用户 B,它失败了。奇怪的是,当我进行调试时,服务似乎工作正常。它能够查询数据库并创建 List 对象并返回它。服务本身永远不会失败。但是客户端应用程序收到“现有连接被远程主机强制关闭”错误。

在我看来,当服务层试图以 XML 格式打包数据以发送回调用应用程序时,似乎发生了一些事情。我认为这必须是与数据相关的问题,因为该呼叫对其他用户来说效果很好。我已经直观地查看了数据,我并没有真正看到任何奇怪的东西。一种猜测是用户 B 的数据有一些时髦的隐藏字符或其他东西,因此导致服务意外关闭。类似的东西。

有什么想法吗?

【问题讨论】:

  • 也许有帮助 - 在从客户端调用服务时,我从服务器中删除了 Web 服务应用程序,并且在错误日志中出现此错误。

标签: wcf


【解决方案1】:

我发现用于诊断此类问题的最佳工具是服务跟踪查看器。设置非常简单(假设您可以编辑配置):

http://msdn.microsoft.com/en-us/library/ms732023.aspx

希望这会有所帮助。

【讨论】:

  • 这有帮助!我遇到了类似的问题,就我而言,ServiceTraceViewer 向我显示了在尝试序列化枚举值时抛出的异常。该操作试图返回一个包含此枚举的对象,而不首先对其进行初始化,并且枚举定义没有默认值 (0) 的成员。所以它不能序列化 0。
  • 我这样做了,它使我能够查明问题。在我的情况下,它是在序列化回客户端期间的 NullReferenceException。这是我想知道的:为什么我最初的异常被埋没在这个连接问题中?它甚至不是任何内部异常,但它是问题的原因。这是迟钝的,我需要想出一种方法来克服这个问题。我可能会发布一个新问题 idk...
【解决方案2】:

我遇到了这个问题,因为我的网站没有绑定到 SSL 端口的证书。我想我会提到它,因为我在 googleweb 的任何地方都没有找到这个答案,我花了几个小时才弄明白。事件查看器中没有显示任何内容,这对于诊断它非常棒。希望这可以减轻其他人的痛苦。

【讨论】:

    【解决方案3】:

    我见过一次。用户是否请求不同数量的数据?我发现即使您可以为数据有效负载配置绑定(即maxReceivedMessageSize),httpRuntime maxRequestLength 也胜过 WCF 设置,因此如果 IIS 试图提供超过该设置的请求,它就会表现出这种行为。

    这样想:

    如果在您的 WCF 行为中 maxReceivedMessageSize 是 12MB,而 maxRequestLength 是 4MB(默认),则 IIS 胜出。

    【讨论】:

    • 我不这么认为。我尝试修改返回的数据以减少它,但它不起作用。正常查询返回 63 行。我将其更改为仅返回 1 行,但仍然失败。用户 A 的数据返回 26 行,并且工作正常。当我修改用户 B 的数据以仅返回 1 行时 - 它仍然失败。很奇怪。
    【解决方案4】:

    我发现如果返回的对象仅具有在构造函数中初始化的 getter 自动属性(使用 C# 6.0 语法),则会出现此错误。

    我相信这是由于 WCF 在客户端使用无参数构造函数反序列化对象,然后设置对象的属性。它需要有一个setavailable(可以是私有的)来填充对象,否则会失败。

    【讨论】:

    • O....我的....上帝....非常感谢您的回答。我想知道为什么在编译时没有提到或发现这一点。
    【解决方案5】:

    我现在只在服务器中遇到此错误,解决方案是在 wcf web.config 中设置maxItemsInObjectGraph 属性 在<behavior> 标签下:

    <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
    

    【讨论】:

      【解决方案6】:

      我也有同样的问题。我的解决方案是这样的:

      如果您在项目中使用 LinQ2SQL,请在 Visual Studio 中打开 dbml 文件并将序列化模式更改为“单向”

      【讨论】:

        【解决方案7】:

        我发现了同样的异常,并在 svclog 跟踪中找到了 InnerException: SocketException.

        查看 Windows 事件日志后,我看到来自 System.ServiceModel.Activation.TcpWorkerProcess 类的错误。

        您是否通过 netTcpBinding 和端口共享在 IIS 中托管 wcf 服务?

        IIS端口共享功能似乎有bug,查看fix

        我的解决方案是在 Windows 服务中托管您的 WCF 服务。

        【讨论】:

        • 这是旧版本的 IIS,比如 6?由于“修复”是从 2011 年开始的,下载链接甚至消失了......
        【解决方案8】:

        在这个完全无用的错误中拔掉头发大约 6 小时后,我的问题最终是我的 data transfer objects 太复杂了。从像public long Id { get; set;} 这样的超级简单属性开始,就是这样......没什么特别的。

        【讨论】:

        • 我的对象有递归引用。
        【解决方案9】:

        我遇到的问题也与序列化有关。原因是我的一些 DTO/业务类和属性在没有更新服务引用的情况下被重命名或删除。我很惊讶我没有得到contract filter mismatch error。但是更新服务参考为我修复了错误(与 OP 相同的错误)。

        【讨论】:

          【解决方案10】:

          在我的情况下,它也与序列化有关。我需要添加 [KnownType(typeof(...)] 对于所有可能出现在序列化中的类。

          【讨论】:

            【解决方案11】:

            在同一解决方案中从一个 Web 项目调试到 Web 服务时,我遇到了这个问题。 Web 服务正在返回 Web 项目无法理解的响应。它会在某些时候再次起作用,然后再次停止。

            这是因为这些项目之间没有明确的引用,所以在按 F5 开始调试时 Web 服务没有构建。一旦我添加了它,错误就消失了。

            【讨论】:

              猜你喜欢
              • 2011-01-06
              • 2013-08-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-01-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多