2013-04-08 6 views
5

Я использую следующий код, чтобы получить конечную точку и записать его в кэш: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, но почему? Как мне заставить его правильно генерировать исключение без необходимости запуска новой задачи?

ответ

15

Моя интуиция говорит мне, что вы звоните Wait или Result дальше вверх по стеку вызовов.

Если это так, то вы вызываете тупик, как I explain on my blog.

+1

Это довольно интуиция. Благодарю. – Askolein

+4

+1, Ваша интуиция - блестящая вещь. – Valentin

Смежные вопросы