Служба WCF, как увеличить таймаут?
Может показаться глупым вопросом, но все в WCF кажется намного сложнее, чем в asmx, как увеличить тайм-аут службы svc?
Вот что я имею до сих пор:
И тогда моя конечная точка будет отображаться следующим образом:
- HTTP не смог зарегистрировать URL http: // +: 8000 / HelloWCF /. У вашего процесса нет прав доступа к этому пространству имен
- Событие запуска приложения WCF
- Несоответствие ContractFilter при исключении EndpointDispatcher
- Увеличение значения тайм-аута в службе WCF
- Существующее соединение было принудительно закрыто удаленным хостом - WCF
Точная ошибка, которую я получаю:
Канал запроса был отключен во время ожидания ответа после 00: 00: 59.9990000. Увеличьте значение тайм-аута, переданного вызову Запросить или увеличьте значение SendTimeout в Binding. Время, отведенное для этой операции, возможно, было частью более длительного таймаута.
В тестовом клиенте WCF есть значок конфигурации, содержащий конфигурацию времени выполнения моей службы:
Как вы видите, что это не те значения, которые я установил для него? Что я делаю не так?
В вашей конфигурации привязки есть четыре значения таймаута, которые вы можете настроить:
Наиболее важным является sendTimeout
, в котором говорится, как долго клиент будет ждать ответа от вашей службы WCF. Вы можете указать hours:minutes:seconds
в ваших настройках – в моем примере я установил тайм-аут до 25 минут.
openTimeout
в качестве названия подразумевает количество времени, которое вы готовы ждать, когда вы откроете соединение с вашим сервисом WCF. Точно так же closeTimeout
– это время, когда вы закрываете соединение (удаляете клиентский прокси), который вы будете ждать до того, как будет выбрано исключение.
Метод receiveTimeout
немного похож на зеркало для sendTimeout
– в то время как таймаут отправки – это время, в течение которого вы будете ждать ответа от сервера, receiveTimeout
– это время, которое вы дадите клиенту для получения и обработки ответ от сервера.
Если вы отправляете туда и обратно «нормальные» сообщения, то они могут быть довольно короткими, особенно с помощью receiveTimeout
, поскольку получение SOAP-сообщения, дешифрование, проверка и десериализация его не требуют почти никакого времени. История отличается от streamовой передачи – в этом случае вам может потребоваться больше времени на клиенте, чтобы фактически завершить «загрузку» streamа, который вы возвращаете с сервера.
Также есть openTimeout, receiveTimeout и closeTimeout. Документы MSDN по привязке дают вам больше информации о том, для чего они предназначены.
Чтобы получить серьезный контроль над всеми сложностями WCF, я настоятельно рекомендую вам приобрести книгу « Learning WCF » Микеле Леру Бустаманте:
и вы также проводите некоторое время, наблюдая за своей серией скринкастов « WCF Top to Bottom » с 15 частями – очень рекомендуется!
Для более продвинутых тем я рекомендую вам ознакомиться с книгой WCF Services программы Juwal Lowy.
Программирование WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg
Конфигурация тайм-аута должна быть установлена на уровне клиента, поэтому настройка, которую я установил в web.config, не имела никакого эффекта, средство тестирования WCF имеет свою собственную конфигурацию, и там, где вам нужно установить тайм-аут.
Лучший способ – изменить любой параметр, который вы хотите в коде.
Выполните приведенный ниже пример:
using(WCFServiceClient client = new WCFServiceClient ()) { client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30); }
В то же время произошла такая же ошибка, но была исправлена, чтобы закрыть каждый вызов клиента wcf. например.
WCFServiceClient client = new WCFServiceClient (); //More codes here // Always close the client. client.Close();
или
using(WCFServiceClient client = new WCFServiceClient ()) { //More codes here }