5

次のコードを使用してエンドポイントを取得し、キャッシュに書き込みます。

public async Task UpdateCacheFromHttp(string Uri)
{
    if (string.IsNullOrEmpty(Uri))
        return;

    var httpClient = new HttpClient();
    var response = await httpClient.GetAsync(Uri);

    if ((response != null) && (response.IsSuccessStatusCode))
    {
        var responseStream = await response.Content.ReadAsStreamAsync();
        WriteToCache(responseStream);
    }
}

コードは IIS で実行されています。

エンドポイントに到達できない場合、GetAsync が例外をスローすることを期待します。Try-Catch を使用しても、失敗することはないようです。GetAsync は返されません (HttpClient で 5 秒のタイムアウトを試みましたが、まだ返されませんでした)。

これは例外をスローします:

public Task UpdateCacheFromHttp(string Uri)
{
    var updateCacheTask = Task.Factory.StartNew(new Action(() =>
    {
        if (string.IsNullOrEmpty(Uri))
            return;

        var httpClient = new HttpClient();
        var response = httpClient.GetAsync(Uri).Result;

        if (response.IsSuccessStatusCode)
        {
            var responseStream = response.Content.ReadAsStreamAsync().Result;
            WriteToCache(responseStream);
        }
    }));

    return updateCacheTask;
}

「リモート サーバーに接続できません」というメッセージが表示されます。

IIS で実行されているコードに関係があると思われますが、なぜでしょうか? 新しいタスクを開始する必要なく、例外を適切にスローするにはどうすればよいですか?

4

2 に答える 2