Вероятно, это связано с проблемой подключения к локальной сети (но также возможна ошибка DNS).
Это может случиться, вы мало что можете сделать.
То, что я предложил бы всегда переносить этот (связанный с сетью) код в цикле с помощью try
/ catch
block (как это также предлагается здесь для других ошибочных операций). Обращайтесь с известными исключениями, подождите немного (скажем, 1000 мс) и повторите попытку (например, 3 раза). Только в случае сбоя все время вы можете оставить / сообщить об ошибке своим пользователям. Очень грубый пример:
private const int NumberOfRetries = 3;
private const int DelayOnRetry = 1000;
public static HttpResponseMessage GetFromUrl(string url) {
for (int i=1; i <= NumberOfRetries; ++i) {
try {
// Also consider to make this method async and await this.
// Note that in "real code" client MUST be disposed
return new HttpClient().GetAsync(url).Result;
}
catch (Exception e) {
// DO BETTER THAN THIS! Catch what you want to handle,
// not all exceptions worth a retry. Documentation and many
// tests will help you to narrow a limited subset of
// exceptions and error codes.
// Last one, (re)throw exception and exit
if (i == NumberOfRetries)
throw;
// Many network related errors will recover "automatically"
// after some time, exact delay is pretty arbitrary and
// should be determined with some tests. 1 second is pretty
// "good" for local I/O operations but network issues may
// need longer delays.
Thread.Sleep(DelayOnRetry);
}
}
}
Более современная и улучшенная версия:
public static async Task<HttpResponseMessage> GetFromUrlAsync(string url) {
using (var client = new HttpClient()) {
for (int i=1; i <= NumberOfRetries; ++i) {
try {
return await client.GetAsync(url);
}
catch (Exception e) when (i < NumberOfRetries) {
await Task.Delay(DelayOnRetry);
}
}
}
}