Служба WCF Net Соединение через сокет TCP прерывается через 15 минут, всегда и независимо от конфигурации привязки - PullRequest
0 голосов
/ 17 марта 2020

У меня есть служба 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)

1 Ответ

1 голос
/ 19 марта 2020

В конце концов я обнаружил причину root этого тайм-аута и отвечу на свой вопрос, если другие люди столкнутся с такой же проблемой.

Все коммуникации между нашими серверами go через брандмауэр. Мы используем SonicWall, который имеет конфигурацию для тайм-аута неактивности TCP ... значение по умолчанию составляет 15 минут, отсюда мой тайм-аут.

В итоге я реализовал механизм, основанный на дескрипторах для длительных операций. Мое вызывающее приложение запросит операцию и получит дескриптор взамен. Затем приложение может использовать дескриптор для получения обновлений о состоянии операции, регулярно вызывая WCF, пока операция не будет завершена.

Проблема решена!

...