2010-08-24 2 views
4

Я звоню во внешнюю службу, используя веб-ссылку. IP-адреса являются динамическими, поэтому я называю их один за другим, и все работает нормально. Периодически некоторые из IP-адресов недоступны, и я получаю таймаут, который я обрабатываю. Проблема заключается в длительности времени, затрачиваемого на тайм-аут, составляет около 30 секунд для каждого вызова. Я попытался изменить свойство тайм-аута на ws до 5 секунд, но это, похоже, не имеет значения. Может кто-нибудь, пожалуйста, помогите мне с этим?C# Web Reference Call Timeout

+1

Не могли бы вы высказать некоторый код того, как вы звоните в службу и как вы устанавливаете таймаут? – taylonr

+0

// Глобальное свойство private WebService.Service1 _ws = new WebService.Service1(); // В конструкторе _ws.Timeout = 5000; // Вызов метода return _ws.create_session (string.Concat (_Domain, @ "\", _UserName), _Password, out lErrorCode); – Jim

+0

Если по этой проблеме больше информации, я бы рекомендовал провести тщательную отладку. Пройдите код и убедитесь, что это вызов веб-службы, а не что-то еще, что занимает так много времени. Если это так, то пока вы переходите через код, проверьте, какое значение свойства Timeout находится в момент выполнения вызова. Возможно, вы установили Timeout на 5000 раньше, но, возможно, что-то другое установили иначе. –

ответ

0

Вы говорите, что вы изменили «свойство таймаута на ws до 5 секунд». Если вы изменяете время ожидания на сервере, то это не поможет вам, когда ваш клиент не сможет подключиться.

Вы используете «веб-ссылку», поэтому я предполагаю, что у вас есть класс клиента, полученный из System.Web.Services.Protocols.SoapHttpClientProtocol. Этот класс происходит от System.Web.Services.Protocols.WebClientProtocol, который имеет свойство Timeout. Попытайтесь изменить это свойство на своем клиенте перед тем, как сделать звонок, и посмотреть, есть ли у вас лучшие результаты.

+0

Это то, что я меняю (на клиенте). Ws - внешний ws, к которому у меня нет доступа. – Jim

+0

и да, я устанавливаю WebClientProtocol.Timeout = 5 – Jim

1

Вот ответ, который я искал: Adjusting HttpWebRequest Connection Timeout in C#

**** Внимание: **** Snippet

Из документации MSDN по HttpWebRequest.Timeout собственности:

A Запрос доменной системы (DNS) может занимать до секунд до возврата или времени . Если ваш запрос содержит имя хоста, для которого требуется разрешение, и вы установите Timeout на значение менее 15 секунд, это может занять 15 секунд или более до того, как будет отправлено WebException, чтобы указать время ожидания вашего запроса.

1

Вы можете выполнить поиск DNS самостоятельно с более коротким тайм-аута (например, 1000 мс):

http://www.chapleau.info/cs/blogs/fchapleau/archive/2008/09/09/reverse-dns-lookup-with-timeout-in-c.aspx

А затем (если IP-адрес был найден) выполнить вызов веб-службы с помощью IP-адреса (чтобы избежать поиска в DNS, где вы не можете контролировать время ожидания) с помощью таймаут, например, 4000 мс (или даже лучше: 5000 мс - (время поиска DNS)), чтобы достичь полного тайм-аута в 5000 мс.