【问题标题】:WCF Exception for long operations: netTcpBinding长操作的 WCF 异常:netTcpBinding
【发布时间】:2011-06-20 06:03:24
【问题描述】:

我们在服务中有以下 netTcpBinding。在一个特定场景中,我们有一个庞大的数据库操作,大约需要 35 分钟才能完成。我收到“套接字连接被中止”异常。为了避免异常,我应该更改哪些设置?

注意:我几乎在 10 分钟后收到异常。默认值为 10 分钟的配置值是什么?

框架:.Net 3.0

更新:当我申请receiveTimeout="00:30:00"时,大约5分钟后出现以下IE错误“系统无法与外部服务器通信”。

在应用它之前,它曾经是我们应用程序的自定义错误页面。知道我现在应该改变什么吗?

注意:它发生在登台服务器中。 (这个问题在我们的开发环境之前和之后都不可用)

注意:对于 Staging,Web 应用程序托管在 IIS 中。 WCF 托管在 Windows 服务中

    <bindings>

        <netTcpBinding>


            <binding name="AdministrationBinding" maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="32" 
                    maxStringContentLength="2147483647" 
                    maxArrayLength="2147483647" 
                    maxBytesPerRead="2147483647" 
                    maxNameTableCharCount="16384"/>
            </binding>
        </netTcpBinding>

    </bindings>

对应的客户端配置如下:

    <binding name="NetTcpBinding_IAdministrationManager" 
             closeTimeout="00:30:00" 
             openTimeout="00:30:00" 
             receiveTimeout="00:30:00" sendTimeout="00:30:00" 
             transactionFlow="false" transferMode="Buffered" 
             transactionProtocol="OleTransactions" 
             hostNameComparisonMode="StrongWildcard" 
             listenBacklog="10"
             maxBufferPoolSize="524288" 
             maxBufferSize="2147483647" 
             maxConnections="10"     
             maxReceivedMessageSize="2147483647">

      <readerQuotas maxDepth="32" 
             maxStringContentLength="2147483647" 
             maxArrayLength="16384" maxBytesPerRead="4096" 
             maxNameTableCharCount="16384"/>

      <reliableSession ordered="true" 
             inactivityTimeout="00:30:00" enabled="false"/>

      <security mode="Transport">
        <transport clientCredentialType="Windows" 
             protectionLevel="EncryptAndSign"/>
        <message clientCredentialType="Windows"/>

      </security>

    </binding>

谢谢

李乔

【问题讨论】:

    标签: c# .net wcf exception nettcpbinding


    【解决方案1】:

    您还需要为服务器端的各种超时添加非默认值。从技术上讲,并非所有超时都对双方都有效/有用(发送与接收,打开与关闭),但为了简单起见,您可以在任何一方镜像它们。

    【讨论】:

    • 简单地在超时时抛出值而不了解它们在做什么是一件危险的事情 - 请参阅我对这个问题的回复stackoverflow.com/questions/6387359/…
    • @Richard Blewett:当然!我的回答当然不是要暗示这一点。但是,无论您选择哪种设计,并且根据您的需要,它们肯定比长时间阻塞更好的方法,您需要确保客户端和服务器设置匹配。关于安全、事务、大小配额和超时。
    【解决方案2】:

    虽然您可以增加超时来停止此异常,但长时间的超时可能会导致您的客户端等待很长时间才能在出现问题时抛出错误。

    我认为让长操作在服务器上异步发生并让方法立即返回可能会更好。如果您需要在客户端通知操作完成,您可以使用回调。

    【讨论】:

      【解决方案3】:

      服务中的 receiveTimeout 默认为 10 分钟 - 这是服务在确定代理已离开之前等待请求的时间。你需要增加这个。但是,您是在进行 35 分钟的同步呼叫吗?

      对于这种情况,我将异步运行所有内容,让客户端定期检查是否完成或使用双工消息传递,以便服务在操作完成时通知客户端

      无论发生什么情况,客户端需要比接收超时更频繁地与服务通信,否则服务将终止连接 - 事实上,如果您使用双工,那么服务需要更频繁地与客户端通信,而不是客户端的接收超时出于同样的原因

      【讨论】:

      • 是的,35 分钟太长了,不能等待!客户真的关心完成,还是应该一劳永逸?
      • 当我在服务中应用 receiveTimeout="00:30:00" 时,大约 5 分钟后出现以下 IE 错误“系统无法与外部服务器通信”。在应用它之前,它曾经是我们应用程序的自定义错误页面。知道我现在应该改变什么吗?注意:它发生在登台服务器中。 (这个问题在我们的开发环境之前和之后都不可用)
      • 您是自行托管还是在 IIS 中托管?
      • 对于 Staging,Web 应用程序托管在 IIS 中。 WCF 托管在 Windows 服务中
      • 您的应用程序在等待 WCF 服务完成时是否阻塞?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2010-10-08
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多