2015-09-15 4 views
2

Я использую Xamarin.iOS Версия: 8.10.5.26 (Indie издание) и сталкивается с очень странным поведением с тайм-ауту запросов, отправленных с HttpClient():System.Net.Http.HttpClient таймаута, кажется, игнорируется

Следующий код пытается получить результат с URL-адреса и имеет тайм-аут 60 секунд (1 минута), но когда запрос уволен, он занимает около 90 секунд для тайм-аута. Когда выполняется вызов, я вручную отключу сетевое подключение, чтобы проверить время ожидания. Наблюдается, что он занимает более 60 секунд.

КОД

public async Task<Dictionary<string,object>> GetPatientDataASync (string lUsername) 
    { 
     var lDict = new Dictionary<string,object>(); 
     try { 
      string lQuerystring = "{Email: '" + lUsername + "'}"; 
      String lUrl = String.Format (Constants.mURLPatient + "?where={0}", JObject.Parse (lQuerystring)); 
      var lClient = new HttpClient(); 
      lClient.BaseAddress = new Uri (lUrl); 
      lClient.DefaultRequestHeaders 
       .Accept 
       .Add (new MediaTypeWithQualityHeaderValue ("application/json")); 
      lClient.DefaultRequestHeaders.Add ("X-Parse-Application-Id", Constants.mKeyParseAppId); 
      lClient.DefaultRequestHeaders.Add ("X-Parse-REST-API-Key", Constants.mKeyRestAPIKey); 
      lClient.Timeout = new TimeSpan (0, 1, 0); 
      var request = new HttpRequestMessage(); 
      request.Method = HttpMethod.Get; 
      if (Utility.isNetworkConnected()) { 
       bool responseStatus = false; 
       await lClient.SendAsync (request) 
        .ContinueWith (responseTask => { 
        if (responseTask != null) { 
         var response = responseTask.Result; 
         if (response != null) { 
         if (response.IsSuccessStatusCode) { 
           var responseContent = response.Content; 
           if (responseContent != null) { 
            string responseString = responseContent.ReadAsStringAsync().Result; 
            if (!string.IsNullOrWhiteSpace (responseString)) { 
             JObject json = JObject.Parse (responseString); 
             if (json != null) { 
              if (json ["results"].Any()) { 
               Patient user = Patient.Instance; 
               user.objectId = json.SelectToken (@"results[0].objectId").Value<string>(); 
               user.Email = json.SelectToken (@"results[0].Email").Value<string>(); 
               user.Name = json.SelectToken (@"results[0].Name").Value<string>(); 
               user.IsNotificationsEnabled = json.SelectToken (@"results[0].IsNotificationsEnabled").Value<string>(); 

               Application.Current.Properties ["IsNotificationsEnabled"] = json.SelectToken (@"results[0].IsNotificationsEnabled").Value<string>(); 

               if (json.SelectToken (@"results[0].DeviceToken") != null) { 
                var deviceToken = json.SelectToken (@"results[0].DeviceToken").Value<JArray>(); 
                if (deviceToken != null) 
                 user.DeviceToken = deviceToken.ToObject < List<string>>(); 
               } else { 
                user.DeviceToken = new List<string>(); 
               } 

               var doctors = json.SelectToken (@"results[0].MyDoctors").Value<JArray>(); 
               user.AllergicTo = json.SelectToken (@"results[0].AllergicTo").Value<string>(); 
               user.ContactNo = json.SelectToken (@"results[0].ContactNo").Value<string>(); 
               user.BloodGroup = json.SelectToken (@"results[0].BloodGroup").Value<string>(); 
               user.MyDoctors = doctors != null ? doctors.ToObject<List<string>>() : new List<string>(); 
               responseStatus = true; 
              } else 
               responseStatus = false; 
             } 
            } 
           } 
          } 
         } 
        } 
       }); 
       lDict.Add (SUCCESS_CODE, responseStatus); 
       return lDict; 
      } else { 
       lDict.Add (NO_INTERNET, Constants.mStringNoInternetMessage); 
       return lDict; 
      } 
     } catch (Exception e) { 
      Debug.WriteLine (e.Message + "\n " + e.StackTrace); 
      lDict.Add (EXCEPTION_OCCURED, e); 
      return lDict; 
     } 
    } 

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

  1. First link

  2. Second Link

ответ

0

Это ноу ошибка, которая была открыта, закрыта и вновь открыт несколько раз на протяжении многих лет , Уже сообщается here и here.

0

Существует обходного решения:

  1. Определение CancellationTokenSource и набор Token для запроса HTTP;
  2. Вызов отмены по таймауту на CancellationTokenSourcects.CancelAfter(timeout);:
  3. Не забывайте об исключении catch, как это.

try 
{ 
} 
catch(TaskCanceledException) 
{ 
    if(!cts.Token.IsCancellationRequested) 
    {// timeout 
    } 
    else 
    {//other reason 
    } 
} 
Смежные вопросы