![](/img/trans.png)
[英]C# HttpClient.SendAsync await throws NullReferenceException
[英]C# HttpClient.SendAsync always returns 404 but URL works in browser
我正在开发一个C#控制台应用程序来测试URL是否有效。 它适用于大多数URL。 但我们发现在某些情况下,应用程序始终从目标站点获得404响应,但URL实际上在浏览器中工作。 当我在DHC(Dev HTTP Client)等工具中尝试使用这些URL时,这些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);
}
}
}
}
此问题的另一个可能原因是,您发送的URL大约超过2048字节。 此时,内容(几乎可以肯定是查询字符串)可能会被截断,这反过来意味着它可能无法与服务器端路由正确匹配。
尽管在浏览器中正确处理了这些URL,但它们也无法在power shell中使用get命令。
通过使用具有键值对的POST而不是使用具有长查询字符串的GET来解决此问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.