Служба WCF, как увеличить время ожидания? - PullRequest
85 голосов
/ 05 октября 2009

Может показаться глупым вопросом, но все в 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. Увеличьте значение тайм-аута, передаваемое вызову Request, или увеличьте значение 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>

Ответы [ 4 ]

170 голосов
/ 05 октября 2009

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

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

Обучение 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 Сверху вниз""- настоятельно рекомендуется!

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

Программирование WCF http://ecx.images -amazon.com / images / I / 41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click, TopRight, 35, -76_AA240_SH20_OU01_.jpg

23 голосов
/ 05 октября 2009

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

19 голосов
/ 30 июля 2014

Лучший способ - изменить любую настройку в своем коде.

Посмотрите на приведенный ниже пример:

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}
4 голосов
/ 19 октября 2011

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

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

или

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...