我正在開發一個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);
}
}
}
}
什麼*確切*是你從代碼中得到的輸出? –
HTTP請求是一個HTTP請求;它來自哪裏並不重要(除非服務器阻塞了某些User-Agent頭,但即使這樣做可以更改)。這_does_聽起來像一個頭問題給我。你是否確實**重現了瀏覽器發送的請求?您是否使用過像Fiddler這樣的工具來準確捕獲HTTP流量,然後將其複製到您的代碼中? – pymaxion
@pymaxion是的。我做你喜歡的事。我使用Fiddler來查看標題在成功的http請求中的樣子。然後在代碼中添加這些標頭。即使我以後得到類似的標題,它仍然無法工作。 – raycode