Служба 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 79
wcf

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" книга Мишеля Леру Бустаманта:

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

дополнительные темы, я рекомендую вам проверить Juwal Лоуи Программирование 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

конфигурация таймаута должна быть установлена на уровне клиента, поэтому конфигурация, которую я устанавливал в интернете.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 
}