Время ожидания службы WCF при превышении NetTcpBinding для клиентов в LN, работает нормально для клиентов в США

#wcf #timeout #nettcpbinding

#wcf #тайм-аут #nettcpbinding

Вопрос:

У меня есть служба WCF, доступная через TCPbinding, запущенная на сервере в Нью-Йорке. У меня нет проблем с подключением к службе и получением результатов от клиентов, подключающихся к этой службе из Америки, но возникают проблемы с клиентами из Лондона / Европы. Я не совсем уверен, почему возникает эта проблема с таймаутом, но ниже приведены настройки клиента и сервера.

Сервер

 <system.serviceModel>
   <bindings>
  <netTcpBinding>
    <binding  name="TCPBinding_IDataService"
              receiveTimeout="00:20:00"
              openTimeout="00:05:00"
              maxBufferPoolSize="2147483647"
              maxReceivedMessageSize="2147483647"
              maxConnections="10"
              maxBufferSize="2147483647">
      <readerQuotas maxDepth="2147483647"
                    maxStringContentLength="2147483647"
                    maxArrayLength="2147483647"
                    maxBytesPerRead="2147483647"
                    maxNameTableCharCount="2147483647"/>
      <security mode="Message">
        <message clientCredentialType="Windows"/>
      </security>
    </binding>
  </netTcpBinding>
</bindings>
   <services>
  <service behaviorConfiguration="DataServiceBehavior" name="DIT.Data.DRD.Service.PIERDataService">
    <endpoint address="DataService" binding="netTcpBinding" bindingConfiguration="TCPBinding_IDataService"
      contract="DIT.Data.DRD.Service.IPIERDataService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="MEX" binding="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:9100/DRDService"/>
      </baseAddresses>
    </host>
  </service>
</services>
   <behaviors>
  <serviceBehaviors>
    <behavior name="DataServiceBehavior" >
      <serviceDebug includeExceptionDetailInFaults="true"/>
      <serviceMetadata httpGetEnabled="false"/>
      <dataContractSerializer maxItemsInObjectGraph="61200000" />
      <serviceThrottling maxConcurrentCalls="100"
                             maxConcurrentInstances="1000"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
   <diagnostics performanceCounters="Default">
  <messageLogging logEntireMessage="true" logMalformedMessages="false"
    logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" />
</diagnostics></system.serviceModel>
  

У моего клиента следующие настройки в коде C #

 private DataServiceClient GetClient(string uri, int? timeout)
    {
        EndpointAddress endpointAddress = new EndpointAddress(new Uri(uri),
                                                              EndpointIdentity.CreateDnsIdentity("localhost"),
                                                              new System.ServiceModel.Channels.AddressHeaderCollection());
        NetTcpBinding svcBinding = new NetTcpBinding();
        svcBinding.Security.Mode = SecurityMode.Message;
        svcBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

        svcBinding.MaxReceivedMessageSize = 2147483647;
        svcBinding.MaxBufferPoolSize = 2147483647;
        svcBinding.MaxBufferSize = 2147483647;
        svcBinding.MaxConnections = 10;

        svcBinding.ReaderQuotas.MaxBytesPerRead = 2147483647;
        svcBinding.ReaderQuotas.MaxDepth = 2147483647;
        svcBinding.ReaderQuotas.MaxArrayLength = 2147483647;
        svcBinding.ReaderQuotas.MaxNameTableCharCount = 2147483647;
        svcBinding.ReaderQuotas.MaxStringContentLength = 2147483647;
        if (timeout.HasValue)
            svcBinding.SendTimeout = svcBinding.ReceiveTimeout = new TimeSpan(0, timeout.Value, 0);
        else
            svcBinding.SendTimeout = svcBinding.ReceiveTimeout = new TimeSpan(0, 5, 0); // this is default

        PIERDataServiceClient dsc = new PIERDataServiceClient(svcBinding, endpointAddress); //this is wcf client from ClientBase
        return dsc;
    }
  

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

ТИА, Шраван

Комментарии:

1. Это может быть какая-то проблема с брандмауэром или списком доступа. Напишите тестовое консольное приложение, которое просто попытается открыть сокет на ваш адрес назначения и порт 9100 (или вы можете попробовать использовать telnet / ssh?). Если это работает, то проблема в WCF. Если этого не происходит, значит, у вас проблема, связанная с сетью.

2. Но дело не во всех вызовах с тайм-аутом. Я вызываю службу, используя несколько фоновых рабочих потоков (максимум 5 одновременно, в зависимости от фильтров, выбранных пользователем в пользовательском интерфейсе клиента). Также такое поведение наблюдается, когда данные составляют около 40 тыс. записей для одного вызова. Вызовы службы, извлекающие меньше данных, в порядке.