2015-11-05 194 views
5

我正在开发一个C#控制台应用程序来测试URL是否有效。它适用于大多数网址。但是我们发现在某些情况下,应用程序总是从目标站点获得404响应,但实际上URL在浏览器中正常工作。当我在诸如DHC(开发HTTP客户端)等工具中尝试使用这些URL时,这些URL也起作用。C#HttpClient.SendAsync总是返回404,但URL在浏览器中工作

在开始,我虽然这可能是不添加正确的标题的原因。但在尝试使用Fiddler编写具有相同头文件的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); 
      } 
     } 
    } 

} 
+0

什么*确切*是你从代码中得到的输出? –

+0

HTTP请求是一个HTTP请求;它来自哪里并不重要(除非服务器阻塞了某些User-Agent头,但即使这样做可以更改)。这_does_听起来像一个头问题给我。你是否确实**重现了浏览器发送的请求?您是否使用过像Fiddler这样的工具来准确捕获HTTP流量,然后将其复制到您的代码中? – pymaxion

+0

@pymaxion是的。我做你喜欢的事。我使用Fiddler来查看标题在成功的http请求中的样子。然后在代码中添加这些标头。即使我以后得到类似的标题,它仍然无法工作。 – raycode

回答

6

这似乎是一个问题所接受的语言。我使用以下Accept-Language头值

_httpClient.DefaultRequestHeaders.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6,ru;q=0.4"); 

enter image description here

P.S.时得到了200响应我假设你知道你的例子_client应该在urlTester构造函数中读取_httpClient或者它不会生成。

+1

非常感谢。它适用于您的解决方案。似乎将英语添加到“Accept-Language”将适用于所有情况。 – raycode

0

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

虽然这些url在浏览器中正确处理,但它们在使用power shell中的get命令时也失败了。

此问题已通过使用带有键值对的POST而不是使用具有长查询字符串的GET来解决。

相关问题