używam następujący kod, aby uzyskać końcowy i zapisać go do pamięci podręcznej:HttpClient nie rzuca wyjątek podczas korzystania czekają na 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);
}
}
Kod jest uruchomiony na IIS.
Jeśli punkt końcowy jest nieosiągalny, oczekiwałbym, że funkcja GetAsync wyrzuci wyjątek. Nawet przy próbie złapania, nigdy nie kończy się niepowodzeniem. GetAsync nigdy nie wraca (próbowałem 5-sekundowego limitu czasu na HttpClient, wciąż nie wróciłem).
to robi wyjątek:
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;
}
uzyskać oczekiwany "Nie można połączyć się ze zdalnym serwerem".
Podejrzeń, że ma to coś wspólnego z kodem uruchomionym w IIS, ale dlaczego? Jak mogę go poprawnie wyrzucić wyjątek bez konieczności uruchamiania nowego zadania?
To dość intuicja. Dzięki. – Askolein
+1, Twoja intuicja jest genialna. – Valentin