如何捕获从HttpWebRequest.GetResponseAsync抛出的异常?

时间:2014-03-14 10:01:26

标签: c# asynchronous httprequest

我有以下方法:

private static async void SendRequest()
{
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://google.com");
    httpWebRequest.KeepAlive = false;
    httpWebRequest.Proxy = null;
    httpWebRequest.Timeout = 1;
    try
    {
        await httpWebRequest.GetResponseAsync();
        Console.WriteLine("GetResponse Finished");
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception thrown="+ex);
    }
}

如果无法解析名称,则抛出异常,但在超时的情况下似乎永远不会抛出异常。如果我使用具有1毫秒的不切实际超时的GetResponse,它总是抛出超时异常,但GetResponseAsync似乎不会发生这种情况。

知道我怎么能像同步方法一样抛出和处理Timeout异常?

2 个答案:

答案 0 :(得分:0)

如上所述in the documentationHttpWebRequest.Timeout不适用于异步请求。在这种情况下,你必须编写自己的超时代码。

或者你可以升级到HttpClient,这会为你做很多工作。

答案 1 :(得分:0)

使用 Wait() 来完成异步方法。在 SendRequest() 中将 void 改为 Task

   static void Main()
   {
      SendRequest().Wait()
   }

    private static async **Task** SendRequest()
    {
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://google.com");
        httpWebRequest.KeepAlive = false;
        httpWebRequest.Proxy = null;
        httpWebRequest.Timeout = 1;
        try
        {
            await httpWebRequest.GetResponseAsync();
            Console.WriteLine("GetResponse Finished");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception thrown="+ex);
        }
    }