У меня есть служба WCF (не размещенная через IIS), и у меня есть другое приложение, которое связывается с моим WCF через net TCP. Все отлично работает, кроме длительных операций. Мой WCF может выполнять такие задачи, как выполнение запросов или резервное копирование баз данных и т. Д. c. Эти задачи могут занять несколько минут или часов. Также невозможно выполнять эти задачи асинхронно.
Проблема: через 15 минут соединение через сокет прерывается, и я не могу понять, откуда это происходит .. .
Вот конфигурация службы WCF:
<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>
И это конфигурация моего приложения:
<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>
Вот то, что я отчаянно пытался до сих пор, без всякой удачи:
- Установить все значения тайм-аута на 24 часа
- Добавлена конфигурация для serviceThrottling с большими значениями для maxConcurrentCalls, maxConcurrentInstances & maxConcurrentSessions
- Отключен брандмауэр на обоих серверах
- Включен общий доступ к портам nettcpbinding
- Включен надежный сеанс с inactivityTimeout = 24h
Независимо от того, что я пытаюсь, я продолжаю получать следующую ошибку через 15 минут:
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)