Код, который я создал для :

 public class RestService : IRestService
    {
        public async Task<StellaData> GetStellConfigData()
        {
            try
            {   
                //Declare a Http client
                HttpClient client = new HttpClient();
                //Add a Base URl
                //client.BaseAddress = new Uri(Constants.MUrl);
                //Add the response type
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                //Add the API
                var response =await client.GetStringAsync(new Uri(Constants.mUrl));

                var myItems = Newtonsoft.Json.JsonConvert.DeserializeObject<StellaData>(response);
                return myItems;

            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            return null;
        }
    }

Что я пытаюсь сделать :

  1. Установить тайм-аут для запроса
  2. Исключение, связанное с Catch для тайм-аута для запроса
  3. Получить код ответа на запрос
3
Devrath 28 Май 2017 в 11:03

2 ответа

Лучший ответ

Этот вопрос действительно не имеет ничего общего с MvvmCross, Xamarin или Android, поскольку вы используете тот же HTTP-клиент, который вы использовали бы в любом приложении .NET. Тем не менее, HttpClient имеет свойство Timeout, которое вы можете установить, чтобы время ожидания ваших запросов истекло после определенного интервала. Я изменил GetStringAsync на GetAsync, так как GetAsync выдаст TaskCanceledException, если истечет время ожидания запроса, который вы можете перехватить и обработать. GetStringAsync внутренне обработает таймаут, и вы не сможете его перехватить. Я переписал ваш метод для достижения этого (этот пример имеет 30-секундный тайм-аут), а также назначил код состояния переменной для использования:

public async Task<StellaData> GetStellConfigData()
{
    try
    {
        using (var client = new HttpClient
        {
            Timeout = TimeSpan.FromMilliseconds(30000)
        })
        {
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var response = await client.GetAsync(new Uri(Constants.mUrl));

            HttpStatusCode statusCode = response.StatusCode;

            var myItems = Newtonsoft.Json.JsonConvert.DeserializeObject<StellaData>(await response.Content.ReadAsStringAsync());
            return myItems;
        }

    }
    catch (TaskCanceledException tcex)
    {
        // The request timed out
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
    }

    return null;
}
2
Luke Pothier 28 Май 2017 в 10:05

Этот класс может быть реорганизован для повторного использования клиента вместо создания нового экземпляра для каждого запроса. Установите время ожидания на клиенте при инициализации.

public class RestService : IRestService {
    private static HttpClient client = new HttpClient();

    static RestService() {
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.Timeout = TimeSpan.FromMilliseconds(Constants.DefaultTimeOut);
    }

    public async Task<StellaData> GetStellConfigData() {
        try {                
            //Add the API
            using(var response = await client.GetAsync(new Uri(Constants.mUrl))) {
                if (response.IsSuccessStatusCode) {
                    return await response.Content.ReadAsAsync<StellaData>();
                }
            }
        } catch (Exception ex) {
            System.Diagnostics.Debug.WriteLine(ex.Message);
        }
        return null;
    }
}
2
Nkosi 28 Май 2017 в 10:31