#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 тыс. записей для одного вызова. Вызовы службы, извлекающие меньше данных, в порядке.