У меня есть служба WCF и приложение со ссылкой на службу, а с приложением у меня есть цикл, и на каждой итерации он вызывает метод в этом веб-сервисе wcf.
Проблема в том, что после примерно 9 вызовов или около того, он просто останавливается ... и если вы нажмете кнопку Pause
VS, вы увидите, что он застрял на линии, где он делает вызов.
Через некоторое время ожидания это TimeoutException выдается:
Время ожидания канала запроса истекло
жду ответа после
00: 00: 59,9970000. Увеличить время ожидания
значение передается в запрос на запрос или
увеличить значение SendTimeout на
Связывание. Время, отведенное на это
операция могла быть частью
более длительный тайм-аут.
Я немного исследовал это и нашел некоторые решения, которые включали редактирование app.config в приложении, и вот его выдержки:
<serviceBehaviors>
<behavior name="ThrottlingIssue">
<serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" />
</behavior>
</serviceBehaviors>
.
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
Затем, после остановки отладки, через пару минут появляется сообщение об ошибке, сообщающее, что произошел катастрофический сбой .
Как я могу исправить эту проблему? У меня не было этой проблемы, когда я работал с обычным веб-сервисом.
Для справки, вот целое app.config
:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ThrottlingIssue">
<serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IDBInteractionGateway" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:28918/DBInteractionGateway.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IDBInteractionGateway"
contract="DBInteraction.IDBInteractionGateway" name="WSHttpBinding_IDBInteractionGateway">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
[Обновление] Решение:
По-видимому, после каждого запроса вам нужно Close
соединение ... Сейчас я закрываю соединение после каждого запроса, и оно работает как чудо.
Хотя я до сих пор не могу понять, что в моем app.config я установил для maxConcurrentCalls и maxConcurrentSessions значение 500, и все же я могу получить только 10. У любого есть ответ на этот вопрос. ? (возможно у меня что-то не так в моем app.config, опубликованном выше)
Ответ на поставленный выше вопрос (теперь пунктирный) объясняется тем, что я редактировал клиент app.config
, а не файл конфигурации службы (web.config
)