Служба 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 для привязки. Время, отведенное на эту операцию, возможно, было частью более длительного тайм-аута.
в тестовом клиенте 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>
4 ответа:
в вашей конфигурации привязки есть четыре значения таймаута, которые вы можете настроить:
<bindings> <basicHttpBinding> <binding name="IncreasedTimeout" sendTimeout="00:25:00"> </binding> </basicHttpBinding>
самое главное -
sendTimeout
, который говорит, как долго клиент будет ждать ответа от службы WCF. Вы можете указатьhours:minutes:seconds
в настройках - в моем примере, я поставил тайм-аут до 25 минут.The
openTimeout
как следует из названия, это количество времени, которое вы готовы ждать, когда вы открываете подключение к службе WCF. Точно так же,closeTimeout
- это время, в течение которого вы закрываете соединение (удаляете прокси-сервер клиента), которое вы будете ждать, прежде чем возникнет исключение.The
receiveTimeout
это немного похоже на зеркало дляsendTimeout
- в то время как тайм-аут отправки-это время, в течение которого вы будете ждать ответа от сервера,receiveTimeout
это время, которое вы дадите клиенту для получения и обработки ответа от сервера.в случае, если вы отправляете туда и обратно "нормальные" сообщения, оба могут быть довольно короткими - особенно
receiveTimeout
, так как получение сообщения SOAP, расшифровка, проверка и десериализация должны занять почти не время. История с потоковой передачей отличается-в этом случае вам может потребоваться больше времени на клиенте, чтобы фактически завершить "загрузку" потока, который вы получаете с сервера.есть также openTimeout, receiveTimeout и closeTimeout. Элемент MSDN docs on binding дает вам больше информации о том, что они предназначены для.
получить серьезно взявшись за все тонкости WCF, я бы настоятельно рекомендовал вам приобрести "изучение WCF" книга Мишеля Леру Бустаманта:
и вы также проводите некоторое время, наблюдая за ней 15-часть " WCF сверху вниз " серия скринкастов-высоко рекомендуется!
дополнительные темы, я рекомендую вам проверить Juwal Лоуи Программирование WCF заказать услуги.
конфигурация таймаута должна быть установлена на уровне клиента, поэтому конфигурация, которую я устанавливал в интернете.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 }