URLが有効かどうかをテストするためのC#コンソールアプリケーションを開発しています。ほとんどのURLではうまくいきます。しかし、アプリケーションがターゲットサイトから常に404応答を受け取ったが、URLが実際にブラウザで動作する場合があることがわかった。また、これらのURLは、DHC(Dev HTTP Client)などのツールで試したときにも機能します。C#HttpClient.SendAsyncは常に404を返しますが、URLはブラウザで動作します
最初は、これが正しいヘッダーを追加しない理由である可能性があります。しかし、同じヘッダーでhttp要求を作成するためにFiddlerを試した後、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ヘッダーをブロックしていない限り、どこから来ても問題ありませんが、変更することもできます。これはヘッダーのようなものです。 **あなたのブラウザから送信されたリクエストを正確に**再現していることを確認しましたか? ** HTTPトラフィックを正確に**キャプチャしてコードに複製するには、Fiddlerのようなツールを使用しましたか? – pymaxion
@pymaxionはい。私はあなたがしていることをしました。私はFiddlerを使って、http reqestの成功の様子を見ています。そして、それらのヘッダーをコードに追加しました。後で似たヘッダーがあっても、それはまだ機能しませんでした。 – raycode