2010-04-08 1 views
27

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

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

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

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

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

ответ

17

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

14

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

+0

Хорошее примечание, и оно скрыто на странице прямо над секцией, на которую указывает эта ссылка. https://msdn.microsoft.com/en-us/library/system.net.webclient.aspx?f=255&MSPPError=-2147217396#Examples – dragon788

20

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

Давайте предположим, что вы создали 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 прямо напротив меня, но у меня использовал это в прошлом, чтобы проверить перенаправления.

+0

Добавлена ​​возможность разрешить перенаправление быть ложным, поскольку это часть исходного OP. – Justin

+1

Typo: 'AllowAutoRedirect' не' AutoAllowRedirect' –

+0

@JohnDyer благодарит Джона, я обновил пример! – Justin

0

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

Смежные вопросы