我的问题是,我的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;
}
这对于一个http请求来说没有太多时间。可能是DNS解析,如备注所述:https://msdn.microsoft.com/en-us/library/system.net.http.httpclient.timeout(v=vs.110).aspx#Anchor_2 – Crowcoder
它也可以是因为你偶尔陷入僵局。 [您应该**从不**在asp.net上下文中的异步调用中使用'.Result'。](https://blog.stephencleary.com/2012/07/dont-block-on-async-code。 HTML)。如果你不能将你的代码转换为异步“一路下来”,那么使用“HttpWebRequest”而不是“HttpClient”。 – Crowcoder
嗯,这是否会导致asp.net web api崩溃? –