Sockets WCF服务网络TCP套接字连接在15分钟后被中止,无论绑定配置如何
我有一个WCF服务(不是通过IIS托管的),还有另一个应用程序通过NetTCP与我的WCF通信。除了长时间运行的操作外,其他一切都很好。我的WCF可能会执行诸如运行查询或备份数据库等任务。这些任务可能需要几分钟或几小时才能完成。异步执行这些任务也不是一个选项 问题:在15分钟后,套接字连接中止,我似乎不知道这是从哪里来的… 以下是WCF服务的配置:Sockets WCF服务网络TCP套接字连接在15分钟后被中止,无论绑定配置如何,sockets,wcf,service,connection,net-tcp,Sockets,Wcf,Service,Connection,Net Tcp,我有一个WCF服务(不是通过IIS托管的),还有另一个应用程序通过NetTCP与我的WCF通信。除了长时间运行的操作外,其他一切都很好。我的WCF可能会执行诸如运行查询或备份数据库等任务。这些任务可能需要几分钟或几小时才能完成。异步执行这些任务也不是一个选项 问题:在15分钟后,套接字连接中止,我似乎不知道这是从哪里来的… 以下是WCF服务的配置: <system.serviceModel> <bindings> <netTcpBinding>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBindingConfigurationForMyWCF"
openTimeout="24:00:00"
closeTimeout="24:00:00"
sendTimeout="24:00:00"
receiveTimeout="24:00:00"
maxReceivedMessageSize="9223372036854775807"
transferMode="Streamed">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" />
</binding>
</netTcpBinding>
</bindings>
<services>
<service name="Namespace.MyWCF">
<endpoint address=""
binding="netTcpBinding"
bindingConfiguration="NetTcpBindingConfigurationForMyWCF"
name="NetTcpBindingEndpointMyWCF"
contract="MyWCF.IMyWCF" />
<endpoint address="mex"
binding="mexTcpBinding"
bindingConfiguration=""
name="MexTcpBindingEndpoint"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://SQLServer/MyWCF" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="">
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000"/>
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
我最终找到了超时的根本原因,并将回答我自己的问题,以防其他人遇到相同的问题 我们服务器之间的所有通信都通过防火墙。我们使用SonicWall,它具有TCP非活动超时的配置。。。默认值是15分钟,这是我超时的原因 我最终实现了一种基于长时间运行操作句柄的机制。我的调用应用程序将请求一个操作并接收一个句柄作为返回。然后,应用程序可以使用句柄通过定期调用WCF来获取操作状态的更新,直到操作完成
问题解决了 我认为处理这些耗时任务的最佳方法是异步执行或将其设置为一种方式。然后我们将处理结果记录在数据库中或在字典中进行设置,键为TaskID,值为处理结果。此外,消息队列可能是另一种选择。@是的,这将是我的下一步。考虑返回一个句柄,允许调用函数定期检查操作的状态
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBindingConfigurationForMyWCF"
openTimeout="24:00:00"
closeTimeout="24:00:00"
sendTimeout="24:00:00"
receiveTimeout="24:00:00"
maxReceivedMessageSize="9223372036854775807"
transferMode="Streamed">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" />
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://SQLServer/MyWCF"
binding="netTcpBinding"
bindingConfiguration="NetTcpBindingConfigurationForMyWCF"
contract="MyWCF.IMyWCF"
name="NetTcpBindingEndpointMyWCF">
</endpoint>
</client>
Exception msg: An existing connection was forcibly closed by the remote host
Exception type: System.Net.Sockets.SocketException
Stack trace: at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout, Boolean closing)
Exception msg: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '23.23:59:59.9843758'.
Exception type: System.ServiceModel.CommunicationException
Stack trace: at System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout, Boolean closing)
at System.ServiceModel.Channels.SocketConnection.Read(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout)
at System.ServiceModel.Channels.DelegatingConnection.Read(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout)
at System.ServiceModel.Channels.ConnectionStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)
at System.Net.Security.NegotiateStream.StartFrameHeader(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.NegotiateStream.ProcessRead(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)