Тайм-аут веб-запроса в .NET - PullRequest
11 голосов
/ 19 марта 2010

Я пытаюсь позвонить по запросу веб-службы на сторонний веб-сайт, сервер которого ненадежен.Есть ли способ установить тайм-аут по запросу на этот сайт?Примерно такой псевдокод:

try // for 1 minute
{
    // Make web request here
    using (WebClient client new WebClient()) //...etc.
}
catch
{
}

Ответы [ 5 ]

24 голосов
/ 19 марта 2010

Вы можете использовать свойство Timeout :

var request = (HttpWebRequest)WebRequest.Create("http://www.google.com");
request.Timeout = 1000; //Timeout after 1000 ms
using (var stream = request.GetResponse().GetResponseStream())
using (var reader = new StreamReader(stream))
{
    Console.WriteLine(reader.ReadToEnd());
}

UPDATE:

Чтобы ответить на вопрос в разделе комментариев о XElement.Load(uri), вы можете сделать следующее:

var request = (HttpWebRequest)WebRequest.Create("http://stackoverflow.com/feeds");
request.Timeout = 1000; //Timeout after 1000 ms
using (var stream = request.GetResponse().GetResponseStream())
using (var reader = new StreamReader(stream))
{
    var xel = XElement.Load(reader);
}
4 голосов
/ 19 марта 2010

WebClient не поддерживает естественное время ожидания. Но вы можете легко создать производный класс с пользовательскими тайм-аутами:

public class TimeoutWebClient : WebClient
{
    private int _timeOut = 10000;
    public int TimeOut
    {
        get
        {
            return _timeOut;
        }
        set
        {
            _timeOut = value;
        }
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest webRequest = base.GetWebRequest(address);
        webRequest.Timeout = _timeOut;
        return webRequest;
    }
}

Источник: http://aspadvice.com/blogs/maniknet/archive/2008/06/16/Ganz-kurz_3A00_-WebClient-mit-eigenem-Verbindungs-Timeout-_2800_WebClient-with-a-custom-connection-timeout_2900_.aspx

2 голосов
/ 19 марта 2010

Может быть, вы должны пойти с

System.Net.WebRequest.Timeout
свойство
1 голос
/ 14 октября 2015

Вы можете проверить исключение WebTimeout со стороны сервера, а затем использовать SignalR для активной отправки сообщений о тайм-ауте обратно клиентам:

var request = (HttpWebRequest)WebRequest.Create("http://www.your_third_parties_page.com");
request.Timeout = 1000; //Timeout after 1000 ms

try
{
    using (var stream = request.GetResponse().GetResponseStream())
    using (var reader = new StreamReader(stream))
    {
         Console.WriteLine(reader.ReadToEnd());
    }
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.Timeout)
    {
         //If timeout then send SignalR message to inform the clients...
         var context = GlobalHost.ConnectionManager.GetHubContext<YourHub>();
         context.Clients.All.addNewMessageToPage("This behavious have been processing too long!");
    }
}

Подробнее как настроить SignalR для asp.net здесь

0 голосов
/ 19 марта 2010

Многие классы в рамках .Net, которые включают в себя любые виды сетей, включают свойство Timeout. Например, в классе WebRequest (System.Net) есть такое свойство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...