2017-05-06 5 views
1

mein Problem ist, dass mein HttpClient Timeout 100 ms ist, also wenn meine Anfrage 100 Millisekunden übergibt, werde ich die Anfrage stoppen. Normalerweise wenn Anfrage 100 ms übergeben kann ich fangen TimeoutException, so kann ich stoppenHttpClient Timeout funktioniert nicht gelegentlich

Aber gelegentlich Anfrage 500, 800, 2000 ms, aber ich kann nicht fangen TimeoutException oder eine andere Ausnahme.

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

Das ist nicht viel Zeit für eine HTTP-Anfrage. Könnte DNS-Auflösung sein, wie in den Anmerkungen beschrieben: https://msdn.microsoft.com/en-us/library/system.net.http.httpclient.timeout(v=vs.110).aspx#Anchor_2 – Crowcoder

+1

Es könnte auch sei es, dass du dich manchmal festgefahren hast. [Sie sollten ** niemals ** '.Result' bei einem asynchronen Aufruf in einem asp.net-Kontext verwenden.] (Https://blog.stephencleary.com/2012/07/dont-block-on-async-code. html). Wenn Sie Ihren Code nicht vollständig in async konvertieren können, verwenden Sie 'HttpWebRequest' anstelle von' HttpClient'. – Crowcoder

+0

Nun, verursacht dies den ASP.net Web API zum Absturz? –

Antwort

0

MSDN documentation sagt, dass:

Ein Domain Name System (DNS) Abfrage bis 15 Sekunden dauern kann, zurückzukehren oder eine Auszeit. Wenn Ihre Anforderung einen Hostnamen enthält, der aufgelöst werden muss, und Sie Timeout auf einen Wert von weniger als 15 Sekunden festlegen, kann es 15 Sekunden oder länger dauern, bevor eine WebException ausgelöst wird, um eine Zeitüberschreitung für Ihre Anforderung anzugeben.

Wenn Ihr ApiHelper._systemInfo.WebApiAddress Domain-Namen enthält, könnte dies ein Grund sein.

+0

ApiHelper._systemInfo.WebApiAddress meine Mvc Web API Adresse als 192.168.2.192:8885 –

Verwandte Themen