【问题标题】:System.Net.Http.HttpClient Timeout seems to be ignoredSystem.Net.Http.HttpClient Timeout 似乎被忽略了
【发布时间】:2015-12-11 21:12:54
【问题描述】:

我正在使用 Xamarin.iOS 版本:8.10.5.26(独立版)并面临一个非常奇怪的行为,即使用 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

【问题讨论】:

    标签: c# xamarin xamarin.ios xamarin.forms xamarin.mac


    【解决方案1】:

    这是一个已知的错误,多年来被打开、关闭和重新打开了好几次。已经举报here和here。

    【讨论】:

      【解决方案2】:

      有解决办法:

      1. 定义CancellationTokenSource并将Token设置为http请求;
      2. 在CancellationTokenSource 上通过超时调用取消,就像这样cts.CancelAfter(timeout);:
      3. 不要忘记捕获异常,像这样。

      try
      {
      }
      catch(TaskCanceledException)
      {
          if(!cts.Token.IsCancellationRequested)
          {// timeout
          }
          else
          {//other reason
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-28
        • 2016-09-30
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 2017-12-05
        • 2012-03-08
        • 2014-04-15
        相关资源
        最近更新 更多