簡體   English   中英

網址無效時,webrequest.begingetresponse花費了太多時間

[英]webrequest.begingetresponse is taking too much time when the url is invalid

我正在使用webrequest來獲取一些圖像數據。 該網址可能會在某個時間被盜用。 如果網址無效,則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();
            }
        }

看起來這是.NET的問題。 BeginGetResponse阻止,直到解析DNS。 如果URL錯誤(例如http:// somecrap ),它將嘗試直到超時。 請參閱以下鏈接-link1link2

我只是遇到了同樣的情況。 雖然這不是一個完美的解決方法,但我還是決定先使用Ping.SendAsync()對站點進行ping操作。 好部分是異步部分立即返回。 不好的部分是額外的步驟,而且並非所有站點都響應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
    }
}

只需編寫代碼並運行一天,但初步結果看起來很有希望。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM