Служба WCF, как увеличить таймаут?
Может показаться глупым вопрос, но все в WCF кажется намного сложнее, чем в asmx, как увеличить тайм-аут службы svc?
Вот что я до сих пор:
<bindings>
<basicHttpBinding>
<binding name="IncreasedTimeout"
openTimeout="12:00:00"
receiveTimeout="12:00:00" closeTimeout="12:00:00"
sendTimeout="12:00:00">
</binding>
</basicHttpBinding>
</bindings>
И тогда моя конечная точка будет отображаться следующим образом:
<endpoint address=""
binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
contract="ServiceLibrary.IDownloads">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
Точная ошибка, которую я получаю:
Время ожидания запроса на запрос после 00: 00: 59.9990000. Увеличьте значение тайм-аута, переданного вызову Запросить или увеличьте значение SendTimeout в Binding. Время, отведенное для этой операции, возможно, было частью более длительного таймаута.
В тестовом клиенте WCF есть значок конфигурации, содержащий конфигурацию времени выполнения моей службы:
Как вы можете видеть, что это не те значения, которые я установил для него? Что я делаю неправильно?
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="">
<extendedProtectionPolicy policyEnforcement="Never" />
</transport>
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
Ответы
Ответ 1
Конфигурация тайм-аута должна быть установлена на уровне клиента, поэтому конфигурация, которую я устанавливал в web.config, не имела никакого эффекта, средство тестирования WCF имеет свою собственную конфигурацию, и там, где вам нужно установить таймаут.
Ответ 2
В вашей конфигурации привязки есть четыре значения таймаута, которые вы можете настроить:
<bindings>
<basicHttpBinding>
<binding name="IncreasedTimeout"
sendTimeout="00:25:00">
</binding>
</basicHttpBinding>
Наиболее важным является sendTimeout
, в котором говорится, как долго клиент будет ждать ответа от вашей службы WCF. Вы можете указать hours:minutes:seconds
в своих настройках - в моем примере я установил таймаут в 25 минут.
openTimeout
, как следует из названия, - это время, которое вы готовы подождать, когда вы откроете соединение с вашей службой WCF. Аналогично, closeTimeout
- это время, когда вы закрываете соединение (удаляете клиентский прокси), который вы будете ждать до того, как будет создано исключение.
receiveTimeout
немного похож на зеркало для sendTimeout
- в то время как таймаут отправки - это время, в течение которого вы будете ждать ответа от сервера, receiveTimeout
- это количество времени, предоставит вам клиент для получения и обработки ответа с сервера.
Если вы отправляете туда и обратно "обычные" сообщения, то они могут быть довольно короткими, особенно receiveTimeout
, так как получение сообщения SOAP, дешифрование, проверка и десериализация это не требует почти никакого времени. История отличается от потоковой передачи - в этом случае вам может потребоваться больше времени на клиенте, чтобы фактически завершить "загрузку" потока, который вы возвращаете с сервера.
Также есть openTimeout, receiveTimeout и closeTimeout. Документы MSDN по привязке дает вам больше информации о том, для чего они предназначены.
Чтобы получить серьезный контроль над всеми сложностями WCF, я настоятельно рекомендую вам приобрести книгу Learning WCF" Michele Leroux Бустаманте:
Обучение WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg
и вы также некоторое время смотрите на ее 15-ю часть WCF Top to Bottom" серия screencast - очень рекомендуется!
Для более сложных тем я рекомендую вам ознакомиться с программой Juwal Lowy Программирование WCF.
Программирование WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg
Ответ 3
Лучший способ - изменить любой параметр, который вы хотите в своем коде.
Посмотрите приведенный ниже пример:
using(WCFServiceClient client = new WCFServiceClient ())
{
client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}
Ответ 4
В то же время появилась одна и та же ошибка, но она была исправлена, чтобы закрыть каждый клиентский вызов wcf.
например.
WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();
или
using(WCFServiceClient client = new WCFServiceClient ())
{
//More codes here
}