webrequest.begingetresponse занимает слишком много времени, когда URL недействителен - PullRequest
1 голос
/ 05 августа 2009

Я использую веб-запрос для получения данных изображения. URL может быть когда-нибудь захвачен. В случае неверного URL begingetresponse занимает время, равное периоду ожидания. Кроме того, контроль перестает отвечать на запросы в течение этого периода. Другими словами, асинхронный обратный вызов не работает асинхронно. Это ожидаемое поведение?

try
                                {
                                    // Async requests 
                                    WebRequest request = WebRequest.Create(uri);
                                    request.Timeout = RequestTimeOut;
                                    RequestObject requestObject = new RequestObject();
                                    requestObject.Request = request;
                                    request.BeginGetResponse(this.ProcessImage, requestObject);
                                }
                                catch (Exception)
                                {
                                    ShowErrorMessage(uri);
                                }

 private void ProcessImage(IAsyncResult asyncResult)
        {            
            try
            {
                RequestObject requestObject = (RequestObject)asyncResult.AsyncState;
                WebRequest request = requestObject.Request;
                WebResponse response = request.EndGetResponse(asyncResult);

                Bitmap tile = new Bitmap(response.GetResponseStream());
                // do something
            }
            catch (Exception)
            {
                ShowErrorMessage();
            }
        }

Ответы [ 2 ]

2 голосов
/ 05 августа 2009

похоже, что это проблема с .NET. BeginGetResponse блокируется до разрешения DNS. В случае неправильного URL (например, http://somecrap) он пытается, пока не получит тайм-аут. См. Следующие ссылки - ссылка1 и ссылка2

1 голос
/ 17 января 2010

Я просто столкнулся с такой же ситуацией. Хотя это не идеальный обходной путь, я решил использовать Ping.SendAsync (), чтобы сначала пропинговать сайт. Хорошая часть - асинхронная часть, возвращенная немедленно. Плохая часть - это дополнительный шаг, и не все сайты отвечают на запросы Ping.

public void Start(WatchArgs args)
{
        var p = new System.Net.NetworkInformation.Ping();
        args.State = p;
        var po = new System.Net.NetworkInformation.PingOptions(10, true);
        p.PingCompleted += new PingCompletedEventHandler(PingResponseReceived);
        p.SendAsync(args.Machine.Name, 5 * 1000, Encoding.ASCII.GetBytes("watchdog"), po, args);
}

private void PingResponseReceived(object sender, .PingCompletedEventArgs e)
{
    WatchArgs args = e.UserState as WatchArgs;
    var p = args.State as System.Net.NetworkInformation.Ping;
    p.PingCompleted -= new System.Net.NetworkInformation.PingCompletedEventHandler(HttpSmokeWatcher.PingResponseReceived);
    args.State = null;
    if (System.Net.NetworkInformation.IPStatus.Success == e.Reply.Status)
    {
        //  ... BeginGetResponse now
    }
    else
    {
        /// ... machine not available
    }
}

Просто код и запуск в течение дня, но первоначальный результат выглядит многообещающим.

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