页面重定向时 HttpWebRequest 和 Restsharp 不返回响应

Posted

技术标签:

【中文标题】页面重定向时 HttpWebRequest 和 Restsharp 不返回响应【英文标题】:HttpWebRequest and Restsharp do not return response when the page is redirected 【发布时间】:2022-01-12 10:33:09 【问题描述】:

我尝试创建简单的控制台应用程序,在其中向 url 发送请求并读取收到的响应代码:

HttpWebRequest 实现

HttpWebRequest init = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse resp = (HttpWebResponse)init.GetResponse();
Console.WriteLine(resp.StatusCode);

RestSharp 实现

var client = new RestClient(url);
client.Timeout = -1;
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.StatusCode);

在大多数情况下,它都能完美运行。但是当网站重定向到另一个页面或端口时(通常是使用反向代理编写的 .net 页面,例如https://www.eventim.pl/),程序会尝试发送请求但从未得到任何响应。

我尝试使用:

//HttpWebRequest
init.AllowAutoRedirect = true;

//RestSharp
client.FollowRedirects = true;

但是情况也是一样的,请求发送了,但是从来没有收到响应,以超时结束。

编辑一:HttpClient 实现

HttpClient client = new HttpClient();
try

  HttpResponseMessage response = await client.GetAsync("https://www.eventim.pl");
  response.EnsureSuccessStatusCode();
  var res = response.StatusCode;
  Console.WriteLine((int)res);

catch (HttpRequestException e)

  Console.WriteLine("\nException Caught!");
  Console.WriteLine("Message :0 ", e.Message);

在这种情况下,它也会在到达response.EnsureSuccessStatusCode();之前超时

【问题讨论】:

你为什么不用HttpClient 我在问题中添加了HttpClient 实现。在这种情况下,我得到了同样的结果 - 在 response.StatusCode 之前超时 【参考方案1】:

该问题与 .NET 或反向代理无关,而是与相关站点永久阻止 HTTP 请求这一事实有关,除非以下 HTTP 标头存在且具有值:

Accept
Accept-Encoding
Accept-Language

例如,对您的代码进行以下修改几乎会立即产生 200 响应:

var client = new HttpClient();

try

    var request = new HttpRequestMessage(HttpMethod.Get, "https://www.eventim.pl");
    request.Headers.Add("Accept", "text/html");
    request.Headers.Add("Accept-Encoding", "gzip, deflate, br");
    request.Headers.Add("Accept-Language", "en");

    var response = await client.SendAsync(request);
    response.EnsureSuccessStatusCode();
    var res = response.StatusCode;
    Console.WriteLine((int)res);

catch (Exception e)

    Console.WriteLine("\nException Caught!");
    Console.WriteLine("Message: 0", e.Message);

以后,请使用浏览器的网络请求控制台和/或 Fiddler 之类的工具来检查 HTTP 请求有效与无效的情况。

【讨论】:

以上是关于页面重定向时 HttpWebRequest 和 Restsharp 不返回响应的主要内容,如果未能解决你的问题,请参考以下文章

如何使用非 ascii 字符处理 HttpWebRequest 重定向

如何从 ASP.Net 发布然后重定向到外部 URL?

Django 从一个页面重定向到另一个页面

重定向到登录页面时,asp.net/iis 不附加 ReturnUrl

通量通知后 ReactRouter 无法正确重定向

Fiddler 和 Windows Phone 7 模拟器 - 重定向到代理