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

后端 未结 2 1583
渐次进展
渐次进展 2021-01-16 09:59

I am using webrequest to fetch some image data. The url may be invaild sometime. In case of invalid URL, begingetresponse is taking time equals to timeout period. Also the c

相关标签:
2条回答
  • 2021-01-16 10:05

    looks like this is an issue with .NET. BeginGetResponse blocks until DNS is resolved. In case of wrong URL (like http://somecrap) it tries until it gets timeout. See the following links - link1 and link2

    0 讨论(0)
  • 2021-01-16 10:17

    I just ran into this same situation. While it's not a perfect workaround I decided to use the Ping.SendAsync() to ping the site first. Good part is the async part return immediately. Bad part is the extra step AND not all sites respond to Ping requests.

    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
        }
    }
    

    Just code and running for a day but initial result look promising.

    0 讨论(0)
提交回复
热议问题