2017-05-06 209 views
1

我的问题是,我的HttpClient超时是100毫秒,所以如果我的请求通过100毫秒,我会停止请求。通常当请求通过100毫秒,我可以赶上TimeoutException,所以我可以停止请求HttpClient超时偶尔不起作用

但偶尔请求通过500,800,2000毫秒,但我不能赶上TimeoutException或其他例外。

using (HttpClient client = new HttpClient()) 
{ 
    client.Timeout = new TimeSpan(0, 0, 0, 0, 100); 
    client.BaseAddress = new Uri(string.Format("http://{0}/", ApiHelper._systemInfo.WebApiAddress)); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    string data = JsonConvert.SerializeObject(model); 
    StringContent content = new StringContent(data, Encoding.UTF8, "application/json"); 
    long time = 0; 
    try 
    { 
     swCheck.Restart(); 
     HttpResponseMessage response = client.PostAsync("api/Access/CheckPlate", content).Result; 
     swCheck.Stop(); 
     time = swCheck.ElapsedMilliseconds; 

     if (response.IsSuccessStatusCode) 
     { 
      result = new PlateCheckApiResponseModel(); 
      string respData = response.Content.ReadAsStringAsync().Result; 
      result = JsonConvert.DeserializeObject<PlateCheckApiResponseModel>(respData); 
     } 
     else 
     { 
      _logger.Warn("response.IsSuccessStatusCode :" + response.StatusCode); 
      _logger.Info("Request Message : " + response.RequestMessage); 
     } 
    } 
    catch (TimeoutException ex) 
    { 
     swCheck.Stop(); 
     time = swCheck.ElapsedMilliseconds; 
     _logger.Warn("Checkapi timeout ,response time: " + time); 
    } 
    catch (AggregateException) 
    { 
     swCheck.Stop(); 
     time = swCheck.ElapsedMilliseconds; 
     _logger.Warn("Checkapi timeout ,response time: " + time); 
    } 
    catch (Exception ex) 
    { 
     _logger.Error(ex, "Exception"); 
     throw ex; 
    } 

    return result; 
} 
+0

这对于一个http请求来说没有太多时间。可能是DNS解析,如备注所述:https://msdn.microsoft.com/en-us/library/system.net.http.httpclient.timeout(v=vs.110).aspx#Anchor_2 – Crowcoder

+1

它也可以是因为你偶尔陷入僵局。 [您应该**从不**在asp.net上下文中的异步调用中使用'.Result'。](https://blog.stephencleary.com/2012/07/dont-block-on-async-code。 HTML)。如果你不能将你的代码转换为异步“一路下来”,那么使用“HttpWebRequest”而不是“HttpClient”。 – Crowcoder

+0

嗯,这是否会导致asp.net web api崩溃? –

回答

0

MSDN documentation说:

域名系统(DNS)查询可能需要长达15秒返回或超时。如果您的请求包含需要解析的主机名,并且您将Timeout设置为小于15秒的值,则可能需要15秒或更长时间才会引发WebException,以指示请求超时。

如果您的ApiHelper._systemInfo.WebApiAddress包含域名,这可能是一个原因。

+0

ApiHelper._systemInfo.WebApiAddress我的Mvc Web Api地址为192.168.2.192:8885 –