Search code examples
c#dotnet-httpclient

C# HttpClient Detect Redirect


I need to detect when there is a redirect. My first thought was to check the status code for 301, but for:

var link = "https://grnh.se/8dc368b82us?s=LinkedIn&source=LinkedIn";
var responseMessage = await httpClient.GetAsync(link);

responseMessage returns "OK" but in the browser this link returns 301 and redirects.

Link redirects

So if I can't rely on this, then I decided to just compare the request URI to the response URI.

GetAsync returns a Task<HttpResponseMessage> but HttpResponseMessage does not have a property for the response URI.

https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpresponsemessage?view=net-5.0

System.Net.WebResponse contains a property for the response URI, but can I use this with HttpClient? or must I use WebRequest for the request?

https://learn.microsoft.com/en-us/dotnet/api/system.net.webresponse?view=net-5.0

Is there a better way?

Note: This will be scanning millions of links, so I'd prefer to instantiate one HttpClient. Microsoft recommends using HttpClient rather than WebRequest: https://learn.microsoft.com/en-us/dotnet/api/system.net.webresponse?view=net-5.0


Solution

  • You can disable automatic redirect like this:

    var httpClient = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false });
    var link = "https://grnh.se/8dc368b82us?s=LinkedIn&source=LinkedIn";
    var responseMessage = await httpClient.GetAsync(link);
    

    Then you can check for redirect comparing responseMessage.StatusCode with common redirect codes:

    MovedPermanently = 301
    Redirect = 302
    TemporaryRedirect = 307
    

    New location will be in responseMessage.Headers.Location and you can request for it again if you need.