Catching exceptions from Asynchronous HttpWebRequest Calls in a Task

c#, httpwebrequest

Solution

Your error is probably happening in your delegate calling `request.EndGetResponse(asyncResult)`.

However you can create the task using:

Task<WebResponse> task = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);

which should propagate any exceptions to the task.

You can check for errors in your `ContinueWith` delegate:

return task.ContinueWith(t =>
{
    if (t.IsFaulted)
    {
        //handle error
        Exception firstException = t.Exception.InnerExceptions.First();
    }
    else
    {
        return FinishWebRequest(t.Result);
    }
});

Alternatively if you're using C#5 then you can use async/await to create your `MakeAsyncRequest`. This will unwrap the exception from the `AggregateException` for you:

private static async Task<string> MakeAsyncRequest(string url)
{
    if (!url.Contains("http"))
        url = "http://" + url;

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
    request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    request.Method = "GET";
    request.KeepAlive = false;
    request.ProtocolVersion = HttpVersion.Version10;

    Task<WebResponse> task = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
    WebResponse response = await task;
    return FinishWebRequest(response);
}

Problem

How would i catch the exception in this method below? ``` private static Task<string> MakeAsyncRequest(string url) { if (!url.Contains("http")) url = "http://" + url; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; request.Method = "GET"; request.KeepAlive = false; request.ProtocolVersion = HttpVersion.Version10; Task<WebResponse> task = Task.Factory.FromAsync( request.BeginGetResponse, asyncResult => request.EndGetResponse(asyncResult), (object)null); return task.ContinueWith(t => FinishWebRequest(t.Result)); } ``` The specific place i am getting 404, 403, etc errors is: ``` Task<WebResponse> task = Task.Factory.FromAsync( request.BeginGetResponse, asyncResult => request.EndGetResponse(asyncResult), (object)null); ``` I cant figure out how to handle them

Original source