Служба WCF, як збільшити час очікування?


93

Це може здатися дурним питанням, але все в 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>

Відповіді:


179

У вашій конфігурації прив'язки є чотири значення часу очікування, які ви можете налаштувати:

<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, я настійно рекомендую придбати книгу Мішеля Леру Бустаманте " Навчання 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 Top to Bottom " - настійно рекомендується!

Для більш складних тем я рекомендую ознайомитись із книгою програмування Юваль Лоуї WCF Services 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


Я намагався додати розділи прив'язки до <system.serviceModel> у web.config, але зараз виникає помилка .... будь-які додаткові кроки, які я пропустив ...
JL.

Я також змінив кінцеву точку в моєму сервісі на <endpoint address = "" binding = "збільшений час очікування" - це неправильно робити?
JL.

Думаю, я зрозумів - binding = "basicHttpBinding" bindingConfiguration = "увеличенное время ожидания"
JL.

точно - прив'язка - це тип використовуваного протоколу - basicHttp, wsHttp, netTcp. Конфігурація прив'язки - це ця конфігурація, яку ви створюєте в конфігурації для зміни таймаутів тощо
marc_s

Смішно навіть після цього, все-таки отримуючи помилку тайм-аута, Марк, чи можете ви, будь ласка, дати якомога більше інформації?
JL.

27

Найкращий спосіб - це змінити будь-яке налаштування, яке ви хочете у своєму коді.

Перегляньте наведений нижче приклад:

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

це краще рішення, а не оновлення конфігурації, щоб я міг налаштувати різне значення для різних дзвінків та послуг, велике спасибі
Салім,

26

Конфігурацію тайм-ауту потрібно встановити на рівні клієнта, тому конфігурація, яку я встановлював у web.config, не мала ефекту, тестовий інструмент WCF має власну конфігурацію, і там потрібно встановити час очікування.


1
ну так - так, як правило, він повинен бути встановлений як на клієнті, так і на сервері, навіть - наприклад у випадку "inactivityTimeout" на сесіях тощо.
marc_s

8
JL: Ви можете показати, що саме ви зробили? у мене така ж проблема
Нік Кан,

Якщо ви користуєтесь "WCF Test Client", клацніть правою кнопкою миші на "Налаштувати файл" у дереві сервісу, а потім натисніть "Редагувати за допомогою SvcConfigEditor" та змініть час очікування в межах прив’язки.
Раддерж

4

Нещодавно отримав ту саму помилку, але зміг її виправити, забезпечивши закриття кожного дзвінка клієнта wcf. напр.

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

або

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

10
Не використовуйте підхід `
Алекс Маршалл,

У коментарях omaralzabir.com/do-not-use-using-in-wcf-client є приклади того, як все-таки використовувати using, не утилізуючи пошкоджений об'єкт каналу. Ось ще один блогер із підходом, більш сумісним із usingблоками: erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper .
Грег
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.