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;
}
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
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
Nun, verursacht dies den ASP.net Web API zum Absturz? –