C#HttpClient.SendAsync始终返回404,但URL在浏览器中工作
我正在开发一个C#控制台应用程序,用于测试URL是否有效。它适用于大多数URL。但我们发现,在某些情况下,应用程序总是从目标站点获得404响应,但URL实际上在浏览器中工作。当我在DHC(devhttpclient)等工具中尝试这些url时,它们也可以工作 起初,我认为这可能是不添加正确标题的原因。但在尝试使用Fiddler编写具有相同头的http请求后,它在Fiddler中工作 那么我的代码怎么了?.NET HttpClient中是否存在任何错误 以下是我的测试应用程序的简化代码:C#HttpClient.SendAsync始终返回404,但URL在浏览器中工作,c#,.net,http,url,dotnet-httpclient,C#,.net,Http,Url,Dotnet Httpclient,我正在开发一个C#控制台应用程序,用于测试URL是否有效。它适用于大多数URL。但我们发现,在某些情况下,应用程序总是从目标站点获得404响应,但URL实际上在浏览器中工作。当我在DHC(devhttpclient)等工具中尝试这些url时,它们也可以工作 起初,我认为这可能是不添加正确标题的原因。但在尝试使用Fiddler编写具有相同头的http请求后,它在Fiddler中工作 那么我的代码怎么了?.NET HttpClient中是否存在任何错误 以下是我的测试应用程序的简化代码: class
class Program
{
static void Main(string[] args)
{
var urlTester = new UrlTester("http://www.hffa.it/short-master-programs/fashion-photography");
Console.WriteLine("Test is started");
Task.WhenAll(urlTester.RunTestAsync());
Console.WriteLine("Test is stoped");
Console.ReadKey();
}
public class UrlTester
{
private HttpClient _httpClient;
private string _url;
public UrlTester(string url)
{
_httpClient = new HttpClient
{
Timeout = TimeSpan.FromMinutes(1)
};
// Add headers
_httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36");
_httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip,deflate,sdch");
_httpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
_httpClient.DefaultRequestHeaders.Add("Accept-Language", "sv-SE,sv;q=0.8,en-US;q=0.6,en;q=0.4");
_url = url;
}
public async Task RunTestAsync()
{
var httpRequestMsg = new HttpRequestMessage(HttpMethod.Get, _url);
try
{
using (var response = await _httpClient.SendAsync(httpRequestMsg, HttpCompletionOption.ResponseHeadersRead))
{
Console.WriteLine("Response: {0}", response.StatusCode);
}
}
catch (HttpRequestException e)
{
Console.WriteLine(e.InnerException.Message);
}
}
}
}
这似乎是公认语言的一个问题。当使用下面的
Accept Language
header值时,我得到了200的响应
_httpClient.DefaultRequestHeaders.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6,ru;q=0.4");
p、 我假设您知道在您的示例中,
\u client
应该在urlTester构造函数中读取\u httpClient
,否则它不会生成。此问题的另一个可能原因是您发送的url长度超过约2048字节。此时,内容(几乎可以肯定是查询字符串)可能会被截断,这反过来意味着它可能无法与服务器端路由正确匹配
尽管这些URL在浏览器中得到了正确处理,但在powershell中使用get命令时也失败了
通过使用带有键值对的POST,而不是使用带有长查询字符串的GET,解决了此问题。您从该代码中获得的具体输出是什么?HTTP请求是HTTP请求;它来自何处并不重要(除非服务器正在阻止某些用户代理头,但即使这样也可以更改)。对我来说,这听起来像是标题问题。您是否已验证您正在准确复制从浏览器发送的请求?您是否使用了像Fiddler这样的工具来准确捕获HTTP流量,然后在代码中复制它?@pymaxion是的。我照你说的做了。我使用Fiddler查看了在成功的http请求测试中头的外观。然后在代码中添加这些标题。即使我后来得到了类似的头,它仍然不起作用。我建议你运行一个网络嗅探器,比如Wireshark,看看到底发生了什么。可能异步客户端还发送了一个
Expect:100 continue
header?@RonKlein嗨,我试图添加_client.DefaultRequestHeaders.ExpectContinue=false,仍然得到404。