C# HttpClient.SendAsync 总是 returns 404 但 URL 在浏览器中有效

C# HttpClient.SendAsync always returns 404 but URL works in browser

我正在开发一个 C# 控制台应用程序来测试 URL 是否有效。它适用于大多数 URLs。但我们发现在某些情况下,应用程序总是从目标站点收到 404 响应,但 URLs 实际上在浏览器中有效。当我在 DHC(Dev HTTP 客户端)等工具中尝试时,那些 URLs 也有效。

一开始我以为这可能是没加对的原因headers。但是在尝试使用 Fiddler 编写具有相同 headers 的 http 请求后,它在 Fiddler 中工作。

那么我的代码有什么问题? .NET HttpClient 有什么错误吗?

以下是我的测试应用程序的简化代码:

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.s。我假设您知道在您的示例中 _client 应该在 urlTester 构造函数中读取 _httpClient 否则它不会构建。

此问题的另一个可能原因是您发送的 url 超过大约 2048 字节长。那时内容(几乎肯定是查询字符串)可能会被截断,这反过来意味着它可能无法与服务器端路由正确匹配。

虽然这些url在浏览器中处理正确,但在powershell中使用get命令也失败了。

通过使用带有键值对的 POST 而不是使用带有长查询字符串的 GET 解决了这个问题。