HttpClient генерирует исключение httprequest при восстановлении сети - PullRequest
0 голосов
/ 13 ноября 2018

Я использую System.Net.Http.HttpClient, чтобы сделать запрос postaysnc.Пока идет запрос, я отключаю сетевой кабель, получаю HttpRequestException.Через некоторое время снова подключите сетевой кабель и сделайте запрос postasync, получая исключение HttpRequestException - иногда я получаю сервер ответов недоступен, иногда таймаут. Нужно ли мне избавляться от httpclient при исключении и заново создавать после выполнения запроса?Как сделать запрос успешным при восстановлении сети.

    private async Task<string> GetServerResult()
    {
        try
        {
            var response = await myHttpClient.PostAsync("https://google.com", httpContent);
            response.EnsureSuccessStatusCode();
        }
        catch (HttpRequestException ex)
        {
            throw new HttpRequestException(ex.Message, ex.InnerException);
        }
    }

1 Ответ

0 голосов
/ 13 ноября 2018

Согласно вашему требованию, вы должны изменить реализацию своего рода в этом случае. Мое предлагаемое решение - использовать механизм кэширования в клиенте WCF и периодически обновлять его.

Очень простая реализация: Он хранит последние кэшированные данные, так что у вас есть копия данных, и когда попадания не удаются, вы можете настроить для этого запасной механизм. Например, у вас есть реализация типа

//You single Cache class
public sealed class ClientCache
{
     #region Singleton implementation
     private static  ClientCache _clientCache = new ClientCache();


     private ClientCache()
     {

     }

     public static ClientCache Instance => _clientCache;    
     #endregion

     //Timer for syncing the data from Server
     private Timer _timer;
     //This data is the cached one
     public string data = string.Empty;

     internal void StartProcess()
     {
            //Initializing the timer
            _timer = new Timer(TimeSpan.FromMinutes(1).TotalMilliseconds); //This timespan is configurable
            //Assigning it an elapsed time event
            _timer.Elapsed += async (e, args) => await SyncServerData(e, args);
            //Starting the timer 
            _timer.Start();

     } 

     //In this method you will request your server and fetch the latest copy of the data
     //In case of failure you can maintain the history of the last disconnected server
     private async Task ProcessingMethod(object sender, ElapsedEventArgs e)
     {
         //First we will stop the timer so that any other hit don't come in the mean while
         timer.Stop();

         //Call your api here 
         //Once the hit is completed or failed 
         //On Success you will be updating the Data object
         //data = result from your api call  

         //Finally start the time again as
         timer.Start();
     } 

}

Теперь перейдем ко второму шагу, где инициализировать класс ClientCache. Наилучшие варианты - инициализировать его в классе Global.asax

.
protected void Application_Start()
{           
      //As
      ClientCache.Instance.StartProcess();
}

Теперь, когда ваш веб-интерфейс вызывает метод, вам не нужно возвращаться на сервер. Просто отправьте результат из вашего кэша как:

private Task<string> GetServerResult()
{
     return Task.FromResult(ClientCache.Instance.data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...