长操作的WCF异常:netTcpBinding

时间:2011-06-20 06:03:25

标签: c# .net wcf exception nettcpbinding

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

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

框架:.Net 3.0

UPDATE :当我应用receiveTimeout =“00:30:00”时,它现在说5分钟后出现以下IE错误“系统无法与外部服务器通信”。

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

注意:它正在登台服务器中发生。 (这个问题在我们的开发前后都没有提供)

注意:对于暂存,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>

由于

Lijo

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

虽然您可以增加超时以停止此异常,但是如果出现问题,长时间超时会导致客户端等待多年的其他问题,然后再抛出错误。

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

答案 2 :(得分:0)

服务中的receiveTimeout默认为10分钟 - 这是服务在决定代理消失之前等待请求的时间。你需要增加这个。但是,你是否进行了35分钟的同步通话?

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

发生了什么,客户端需要比receiveTimeout更频繁地与服务通信,否则服务将终止连接 - 事实上,如果您使用双工,则服务需要更频繁地与客户端通信客户端的receiveTimeout出于同样的原因