2016-02-12 9 views
0

Как бороться с проблемой тайм-аута при вызове службы REST. Мои GetAsync функции:Потребление отдыха api timeout

private async Task<string> GetAsync(string endPoint, string id) 
    { 
     using (var httpClient = new HttpClient()) 
     { 
      SevenMResultNx<string> result = new SevenMResultNx<string>(false); 

      httpClient.BaseAddress = new Uri(baseAddress); 
      httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 
      httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(token); 

      // HTTP GET 
      HttpResponseMessage response = await httpClient.GetAsync(String.Format("{0}/{1}", endPoint, id)); 
      if (response.IsSuccessStatusCode) 
      { 
       return await response.Content.ReadAsStringAsync(); 
      } 
      else 
      { 
       return response.ReasonPhrase; 
      } 
     } 
    } 

называется так:

 Task<string> task = GetAsync(endPoint, id); 
     var responseGet = task.Result; 

Всякий раз, когда конечная точка является недоступной, я получил проблему, потому что процесс ждет бесконечность.

ответ

2

Я предлагаю вам принять метод CancellationToken, который затем можно передать на методы GetAsync и ReadAsStringAsync.

Вы можете легко создать маркер отмены, который истекает через определенное время:

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1)); 
var text = await GetAsync(endpoint, id, cts.Token); 

Кроме того, с помощью Result в вызывающей почти наверняка ошибка. Это означает, что если вы используете планировщик с одним потоком, вы будете блокированы - ваш поток будет ждать завершения задачи, но он не сможет завершить, потому что когда завершается вызов httpClient.GetAsync, он должен выполнить больше кода в том же потоке. Два улучшения:

  • В вашем GetAsync метода, где вы ожидающая задачу, использовать ConfigureAwait(false), как вы, вероятно, не все равно, какой поток остальной части метода асинхронного продолжается
  • Сделать вызов код асинхронных а также ждать ожидаемой задачи.
+0

Не работает для меня. Возможно, есть ошибка в том, как я вызываю задачу. – iljon

+0

@iljon: Ну, вы не должны использовать 'task.Result', как это, я не заметил этого. Вы должны использовать 'await', почти во всех случаях. Но мы не можем сказать, правильно ли вы передали «CancellationToken» - я немного изменил свой ответ, так как не видел вызов «ReadAsStringAsync». Я отредактирую ответ, чтобы включить его, используя ожидание. –

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