Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 472
ThomasRones Avatar asked Jul 15 '26 23:07

ThomasRones


1 Answers

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.

like image 124
liiw Avatar answered Jul 21 '26 04:07

liiw