Я использую следующий код, чтобы получить конечную точку и записать его в кэш:HttpClient не бросает исключение при использовании AWAIT на GetAsync
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 никогда не возвращается (я пробовал 5-секундный тайм-аут на HttpClient, все равно не вернулся).
Это делает сгенерирует исключение:
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, но почему? Как мне заставить его правильно генерировать исключение без необходимости запуска новой задачи?
Это довольно интуиция. Благодарю. – Askolein
+1, Ваша интуиция - блестящая вещь. – Valentin