Перенаправление WebRequest в .NET Core - PullRequest
0 голосов
/ 16 октября 2018

Я написал следующую программу на C # с использованием .NET 4.7.1:

var req = (HttpWebRequest) WebRequest.Create(myUrl);
req.MediaType = "GET";
req.AllowAutoRedirect = false;
var rsp = req.GetResponse();
Console.WriteLine(rsp.Headers["Location"]);

Сайт, с которого я запрашиваю, возвращает ответ 301, а заголовок «Location» содержит URL-адрес для перенаправления на.

Если я сделаю то же самое, используя .NET Core 2.1, вместо этого я получу WebException, брошенный из вызова на GetResponse.Как я могу аннулировать это?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я в значительной степени понял это, пока работал над этим, но я подумал, что опубликую это здесь, если другие столкнутся с той же проблемой.

Ответ включен как часть исключения, котороеэто бросить, поэтому я смог получить то же поведение, что и в .NET 4.7.1, изменив мой код следующим образом:

var req = (HttpWebRequest) WebRequest.Create(myUrl);
req.MediaType = "GET";
req.AllowAutoRedirect = false;
try
{
    var rsp = req.GetResponse();
    Console.WriteLine(rsp.Headers["Location"]);
}
catch (WebException e)
{
    var rsp = (HttpWebResponse) e.Response;
    if (rsp.StatusCode == HttpStatusCode.Moved ||
        rsp.StatusCode == HttpStatusCode.MovedPermanently ||
        rsp.StatusCode == HttpStatusCode.Found)
    {
        Console.WriteLine(rsp.Headers["Location"]);
    }
    else throw;
}
0 голосов
/ 16 октября 2018

Исходя из этого , вам нужно перехватить его в блоке try/catch и проверить WebException:

Если вы установите AllowAutoRedirect, то вы закончитедо не после перенаправления.Это означает, что в конечном итоге с ответом 301.HttpWebRequest (в отличие от HttpClient) генерирует исключения для неуспешных (не 200) кодов состояния.Таким образом, ожидается исключение (скорее всего, WebException).S o, если вам нужно обработать это перенаправление (кстати, HTTPS -> HTTP), вам нужно перехватить его в блоке try / catch и проверить исключение WebException и т. Д. Это стандартное использование HttpWebRequest.

Именно поэтому мы рекомендуем разработчикам использовать HttpClient с более простым шаблоном использования.

Примерно так:

WebResponse rsp;

try 
{
   rsp = req.GetResponse();
}

catch(WebException ex) 
{
    if(ex.Message.Contains("301"))
        rsp = ex.Result;
}
...