31

OK, i was recently switch to .NET framework 4.5 and start using HttpClient instead of HttpWebRequest & Response. I really love that async/await style but i don't know how to get the redirected url after a POST / GET request.

With HttpWebResponse i can use .ResponseUri attribute

HttpWebRequest request = (HttpWebRequest)WebRequest.Create ("http://www.google.com");
HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
string responseURI = response.ResponseUri;

Took me 3 hours of searching and i still can't get it done:(

2 Answers 2

52

So from the msdn articles HttpResponseMessage returns as a Task from an HttpClient call.

This HttpResponseMessage has a property called Request Message, which has a property called RequestUri, make sure to look in the properties section of this link.

Sample Code:

// Create a New HttpClient object.
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync("http://www.yahoo.com/");
response.EnsureSuccessStatusCode();
string responseUri = response.RequestMessage.RequestUri.ToString();
Console.Out.WriteLine(responseUri);
Sign up to request clarification or add additional context in comments.

7 Comments

well, finally i can't use HttpClient at all, it's lacking too much basic function. i really appreciate if you can show me how to specific a source ip for HttpClient because my server have about 10 ip address and i want to use all of it
@aznboy84 can you clarify your request? what goal are you trying to accomplish?
HttpResponseMessage.RequestMessage refers to the request which led to the response message. HttpResponseMessage.RequestMessage.RequestUri refers to the uri that was requested not the last uri from which the response was redirected to. Reference: msdn.microsoft.com/en-us/library/…
If you are only interested in the redirect URL, and not the contents of the URL (the resource), then it is very important to add HttpCompletionOption.ResponseHeadersRead as the second parameter of the GetAsync() call. Otherwise, you will download the entire resource before being able to get the redirect URL -- imagine if the resource was a 1GB file!
Re: @stormwild 's comment - HttpResponseMessage.RequestMessage does refer to the same object used in the original request, however HttpClient will modify the HttpRequestMessage.RequestUri to the last uri fetched.
|
0

Old question, but this is a modern update:

internal static Uri GetEndURI(Uri requestedUri)
{
    try
    {
        using (var client = new HttpClient(new HttpClientHandler { AllowAutoRedirect = true }))
        {
            client.Timeout = new TimeSpan(0, 0, 5);
            using (var response = client.SendAsync(new HttpRequestMessage(HttpMethod.Head, requestedUri)))
            {
                var result = response.Result;
                return result.RequestMessage.RequestUri;
            }
        }
    }
    catch (Exception)
    {
        // Something went wrong
    }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.