Получение местоположения от веб-клиента по HTTP 302 Redirect? - PullRequest
27 голосов
/ 09 апреля 2010

У меня есть URL-адрес, который возвращает перенаправление HTTP 302, и я хотел бы получить URL-адрес, на который он перенаправляет.

Проблема в том, что System.Net.WebClient, кажется, действительно следует этому, что плохо. HttpWebRequest, кажется, делает то же самое.

Есть ли способ сделать простой HTTP-запрос и вернуть целевое местоположение без WebClient после него?

Я испытываю желание сделать необработанное соединение через сокет, так как HTTP достаточно прост, но сайт использует HTTPS, и я не хочу делать Handshaking.

В конце концов, мне все равно, какой класс я использую, я просто не хочу, чтобы он следовал HTTP 302 Redirects:)

Ответы [ 4 ]

21 голосов
/ 09 апреля 2010

Это довольно легко сделать

Предположим, вы создали запрос HttpWebRequest с именем myRequest

// don't allow redirects, they are allowed by default so we're going to override
myRequest.AllowAutoRedirect = false;

// send the request
HttpWebResponse response = myRequest.GetResponse();

// check the header for a Location value
if( response.Headers["Location"] == null )
{
  // null means no redirect
}
else
{
  // anything non null means we got a redirect
}

Извините за любые ошибки компиляции, у меня нет VS прямо передо мной, но я использовал это в прошлом для проверки перенаправлений.

17 голосов
/ 09 апреля 2010

На HttpWebRequest вы можете установить AllowAutoRedirect на false для самостоятельного перенаправления.

14 голосов
/ 09 апреля 2010

HttpWebRequest имеет свойство AllowAutoRedirect, которое вы можете установить в false ( всегда верно для WebClient), а затем получить Location HTTP-заголовок.

0 голосов
/ 12 ноября 2015

Кроме того, для человека, которому просто нужно новое местоположение, HttpResponseMessage имеет свойство RequestMessage. Иногда это может быть полезно, потому что WebClient не поддерживает изменение свойства AllowAutoRedirect после его установки.

...