【问题标题】:webrequest.begingetresponse is taking too much time when the url is invalid当 url 无效时,webrequest.begingetresponse 花费了太多时间
【发布时间】:2012-04-26 05:49:19
【问题描述】:

我正在使用 webrequest 来获取一些图像数据。该网址有时可能无效。如果 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();
            }
        }

【问题讨论】:

  • 不,如果您使用 BeginGetResponse,预期的行为将是 UI 保持响应。您能否向我们展示您调用 BeginGetResponse 的代码的 sn-p?
  • 您有什么方法可以在发送之前验证该网址吗?我认为您请求的服务器对您来说是一个黑匣子,无权访问该代码?
  • 我认为我必须在使用之前验证 URL,而不是盲目使用 URL。不得不写更多的代码:(

标签: c# .net visual-studio


【解决方案1】:

看起来这是 .NET 的问题。在解析 DNS 之前,BeginGetResponse 会阻塞。如果 URL 错误(如http://somecrap),它会尝试直到超时。请参阅以下链接 - link1link2

【讨论】:

    【解决方案2】:

    我刚刚遇到了同样的情况。虽然这不是一个完美的解决方法,但我决定先使用 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
        }
    }
    

    只需编写代码并运行一天,但初步结果看起来很有希望。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-15
      • 2020-07-23
      • 2013-07-11
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多