Служба WCF - размер сообщения/объекта, связанный

У меня есть служба wcf (S1) в качестве клиента и другая служба Wcf (S2) в качестве сервера. S1 потребляет S2 через net.tcp. S2 имеет одну операцию, которая возвращает сложный объект, большая часть содержимого которого является строкой. Средний размер этого объекта составляет 7-8 МБ.

Недавно мне пришлось добавить больше строкового содержимого в фактический граф объектов. Это приводит к тому, что S2 возвращает следующую ошибку

Соединение сокета было прервано. Это может быть вызвано ошибкой обработки вашего сообщения, превышением тайм-аута приема удаленным хостом или проблемой с базовыми сетевыми ресурсами. Время ожидания локального сокета было «00:05:00». System.Net.Sockets.SocketException (0x80004005): существующее соединение было принудительно закрыто удаленным узлом в System.Net.Sockets.Socket.Receive(Byte[] буфер, смещение Int32, размер Int32, SocketFlags socketFlags) в System.ServiceModel .Channels.SocketConnection.ReadCore (буфер Byte [], смещение Int32, размер Int32, тайм-аут TimeSpan, логическое закрытие)

Однако все работает, как и ожидалось, когда я удаляю часть строкового содержимого из графа объектов.

Сделав небольшую домашнюю работу, мне удалось прийти к выводу, что это как-то связано с размером возвращаемого объекта. Это заставило меня пересмотреть конфигурацию/квоты моего клиента и службы.

Однако мне не повезло даже после изменения атрибутов клиента и службы, особенно связанных с размером.

Может ли кто-нибудь помочь мне в этом? Пожалуйста, спросите меня для получения дополнительной информации, если это необходимо.

Заранее спасибо.

Клиент (S1)

<netTcpBinding>
        <binding name="NetTcp" closeTimeout="00:05:00"
          openTimeout="00:05:00" receiveTimeout="00:10:00" sendTimeout="00:05:00"
          transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
          hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="2147483647"
          maxBufferSize="2147483647" maxConnections="10" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
            enabled="false" />
          <security mode="None">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </netTcpBinding>
    <client>
          <endpoint address="net.tcp://xxxxxxxx/xxxxxxService"
            binding="netTcpBinding" bindingConfiguration="NetTcp" behaviorConfiguration="RBehavior"  
            contract="IService" name="NetTcp" />
        </client>
        <services/>

        <behaviors>
          <serviceBehaviors>
            <behavior name="NSBehavior">
              <etwTracking profileName="EndToEndMonitoringProfile"/>
              <serviceMetadata httpGetEnabled="false"/>
              <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior> 

          </serviceBehaviors>
        <endpointBehaviors>                                   
                <behavior name="RBehavior">
     **<dataContractSerializer maxItemsInObjectGraph="2147483647" />**
                </behavior>
            </endpointBehaviors>
        </behaviors>

        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
      </system.serviceModel>

     <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
      </system.webServer>

Сервер (S2)

<system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="netTcp" closeTimeout="00:03:00"
          openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00"
          transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
          hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="20000000"
          maxBufferSize="20000000" maxConnections="10" maxReceivedMessageSize="20000000">
          <readerQuotas maxDepth="32" maxStringContentLength="20000000"
            maxArrayLength="20000000" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <reliableSession ordered="true" inactivityTimeout="00:10:00"
            enabled="false" />
          <security mode="None">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>

    <services>
      <service name="Engine.Rules"
               behaviorConfiguration="REServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://xxxxx:8005/Service"/>
          </baseAddresses>
        </host>
        <endpoint address=""
                  binding="netTcpBinding" bindingConfiguration="netTcp"
                  contract="Ixxxx" />
        <endpoint address="mex"
                  binding="mexTcpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="REServiceBehavior">
          <serviceMetadata httpGetEnabled="false"/>
      **<dataContractSerializer maxItemsInObjectGraph="2147483647"/>**
          <serviceDebug includeExceptionDetailInFaults="true"/>  
          <serviceThrottling maxConcurrentSessions="1000"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Обновление: при разумной поддержке @ErikFunkenbusch я прилагаю информацию о трассировке службы.Exception

<ExceptionString>System.ServiceModel.CommunicationException: 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 '00:05:00'. ---&gt; System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   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)
   --- End of inner exception stack trace ---</ExceptionString>
<InnerException>
<ExceptionType>System.Net.Sockets.SocketException, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
<Message>An existing connection was forcibly closed by the remote host</Message>
<StackTrace>
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)
</StackTrace>
<ExceptionString>System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host
   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)</ExceptionString>
<NativeErrorCode>2746</NativeErrorCode>
</InnerException>
</Exception>

person Sreejith Nair    schedule 31.03.2015    source источник
comment
Вместо того, чтобы просто настраивать вещи случайным образом, почему бы вам просто не включить трассировку сообщений на сервере, а затем посмотреть журнал трассировки, чтобы увидеть, какое значение нужно увеличить?   -  person Erik Funkenbusch    schedule 01.04.2015
comment
Мне не повезло настроить трассировку для этих отдельных сервисов. Любые советы о том, как установить это для привязки net.tcp?   -  person Sreejith Nair    schedule 01.04.2015
comment
Что ты имеешь в виду под невезением? Трассировка очень проста и работает одинаково для всех служб WCF независимо от транспорта. msdn.microsoft.com/en-us/library /ms733025(v=vs.110).aspx   -  person Erik Funkenbusch    schedule 01.04.2015
comment
@ErikFunkenbusch, спасибо за ссылку. Я включил трассировку. След не записывается. Кроме того, S2 — это wcf, размещенный с использованием службы Windows, а S1 — это wcf, размещенный в IIS.   -  person Sreejith Nair    schedule 01.04.2015
comment
Не имеет значения, размещен ли он службой Windows. Вам нужно убедиться, что он записывает журнал в место, в которое у службы есть разрешение на запись.   -  person Erik Funkenbusch    schedule 01.04.2015
comment
@ErikFunkenbusch, спасибо. Теперь я мог получить журнал трассировки. Раньше это не удавалось из-за разрешения на каталог. Очень признателен. Тем не менее, ошибка, которую я не мог перевести, ошибки и идет выше моей головы. Я буду обновлять свой первоначальный пост с журналом трассировки/изображением. Пожалуйста помоги.   -  person Sreejith Nair    schedule 01.04.2015
comment
Это исключения в методе Receive, это странно, потому что ваш сервер должен ОТПРАВЛЯТЬ данные...   -  person Erik Funkenbusch    schedule 01.04.2015


Ответы (1)


Вы пытались увеличить значения времени ожидания отправки и получения? Вы отправляете много данных по сети (7-8 МБ), и 5 секунд может быть недостаточно для завершения этой транзакции. Попробуйте установить их примерно на 30 секунд, а затем работайте оттуда.

E:

<binding name="netTcp" closeTimeout="00:30:00"
      openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00">

Это то, что я имею в виду, в частности.

person Adam    schedule 31.03.2015
comment
Это 5 и 3 минуты. - person Sreejith Nair; 01.04.2015