2009-10-05 4 views
77

Может показаться глупым вопросом, но все в WCF кажется намного сложнее, чем в asmx, как увеличить тайм-аут службы svc?Служба WCF, как увеличить таймаут?

Вот то, что я до сих пор:

<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> 

ответ

23

Тайма-аута должна быть установлена ​​на уровне клиента, поэтому конфигурации я садился в web.config не было никакого эффекта, инструмент для тестирования WCF имеет свою собственную конфигурацию и там, где вам нужно для установки таймаута.

+1

хорошо, да - обычно он должен быть установлен как на клиенте, так и на сервере, даже - например. в случае «inactivityTimeout» на сеансах и тому подобное. –

+7

JL: Вы можете показать, что вы сделали? У меня такая же проблема –

+0

Если вы используете «тестовый клиент WCF», щелкните правой кнопкой мыши «Config File» в дереве сервисов, затем нажмите «Изменить с помощью SvcConfigEditor» и измените время ожидания в привязках. – Radderz

154

В вашей конфигурации связывания, есть четыре значения времени ожидания вы можете настроить:

<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 docs on binding дает вам больше информации о том, для чего они предназначены.

Чтобы получить серьезный контроль над всеми intricasies в WCF, я бы настоятельно рекомендуем вам приобрести «Learning WCF» книги Мишель Леру Бустаманте:

Learning 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 -part "WCF Top to Bottom" серия screencast - очень рекомендуется!

Для более сложных тем я рекомендую вам ознакомиться с книгой услуг Juwal Lowy's Programming WCF.

конфигурация

Programming WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

+0

Я пытался добавить обязательные разделы в в web.config, но его бросали ошибка сейчас .... какие-либо дополнительные шаги I я пропустил ... –

+0

Я также изменил конечную точку в моей службе на

+0

Я думаю, что получаю это - binding = "basicHttpBinding" bindingConfiguration = "IncreasedTimeout" –

4

В то же время произошла такая же ошибка, но была исправлена, чтобы закрыть каждый вызов клиента wcf. например.

WCFServiceClient client = new WCFServiceClient(); 
//More codes here 
// Always close the client. 
client.Close(); 

или

using(WCFServiceClient client = new WCFServiceClient()) 
{ 
    //More codes here 
} 
+9

Не используйте подход «использование»: http: // omaralzabir.com/do-not-use-use-in-wcf-client/ –

+0

В комментариях http://omaralzabir.com/do-not-use-using-in-wcf-client есть примеры того, как все еще используйте 'using', пока не удаляете поврежденный объект канала. Вот еще один блоггер с подходом, более совместимым с блоками 'using': http://erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper/. – Greg

13

Самый лучший способ, чтобы изменить какие-либо настройки вы хотите в вашем коде.

Заканчивать ниже пример:

using(WCFServiceClient client = new WCFServiceClient()) 
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30); 
} 
+0

отличный совет, спасибо – ukie

Смежные вопросы