URLが有効か機能するかをテストするためのC#コンソールアプリケーションを開発しています。ほとんどのURLでうまく機能し、ターゲットWebサイトからHTTPステータスコードで応答を取得できます。ただし、他のいくつかのURLをテストする場合、アプリケーションはHttpClient.SendAsyncメソッドの実行時に「リクエストの送信中にエラーが発生しました」例外をスローします。したがって、このURLが実際にブラウザで機能する場合でも、応答またはHTTPステータスコードを取得できません。私はこのケースを処理する方法を見つけることを切望しています。 URLが機能しない場合、またはサーバーがリクエストを拒否する場合、少なくとも対応するHTTPステータスコードを提供する必要があります。
テストアプリケーションの簡略化されたコードは次のとおりです。
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace TestUrl
{
class Program
{
static void Main(string[] args)
{
// var urlTester = new UrlTester("http://www.sitename.com/wordpress"); // works well and get 404
// var urlTester = new UrlTester("http://www.fc.edu/"); // Throw exception and the URL doesn't work
var urlTester = new UrlTester("http://www.ntu.edu.tw/english/"); // Throw exception and the URL works actually
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();
_url = url;
}
public async Task RunTestAsync()
{
var httpRequestMsg = new HttpRequestMessage(HttpMethod.Head, _url);
try
{
using (var response = await _httpClient.SendAsync(httpRequestMsg, HttpCompletionOption.ResponseHeadersRead))
{
Console.WriteLine("Response: {0}", response.StatusCode);
}
}
catch (Exception e)
{
}
}
}
}
}
InnerException
を見ると、次のことがわかります。
「リモート名を解決できませんでした: 'www.fc.edu'」
このURLは私のブラウザーでも機能しません。
HTTP応答を取得するには、クライアントがサーバーと通信できる必要があります( エラー404 を取得する場合でも)、そして、場合によってはエラーが発生しました DNSレベルで 。
特定のURLが見つからない場合、ブラウザが異なるサフィックス/プレフィックスを使用して再試行するこの種のケースに対して、一部のブラウザには自動補完機能があります。次に例を示します。
_try "x"
if didn't work, try "www." + x
if this didn't work try "www." + x + ".com"
if this didn't work try "www." + x + ".net"
if this didn't work try "www." + x + "." + currentRegionSuffix.
_
ただし、次からコードを変更できることに注意してください。
_catch (Exception e)
{
}
_
に:
_catch (HttpRequestException e)
{
Console.WriteLine(e.InnerException.Message);
}
_
また、エラーの原因を確認できます。
また、スローアーがジェネリックException
をスローしていない限り、ジェネリックException
をキャッチしたくない、さらには、例外をキャッチして何もせず、少なくともログに記録します。
その1つのタスクのみを待つため、使用できることに注意してください。
_urlTester.RunTestAsync().Wait();
_
の代わりに:
_Task.WhenAll(urlTester.RunTestAsync());
_
_Task.WhenAll
_は、指定されたTask
sが完了すると、新しいTask
を作成します。あなたの場合は、_Task.WaitAll
_またはが必要ですTask.WhenAll(...).Wait()
。