我有一个基于Asp.net核心MVC的客户端应用程序(V1.1.1)和一个基于Asp.net核心的Web (V2.1)。我在Azure主持了这两个节目。
在发出一些请求时,这个web应用程序失败了,给了502个不好的网关响应。
响应状态代码并不表示成功: 502 (坏网关)。 指定的CGI应用程序遇到错误,服务器终止该进程。
这个问题是断断续续的,然而,当请求需要超过2分钟的时间处理时,似乎就会发生。我已经将requestTimeout设置为Web.config文件中的客户端和API端的20分钟,但仍未得到解决。有时,同样的请求在较短的时间内被处理,而我正在得到响应。
此外,Httpclient的5分钟超时也已设置,但没有运气。
<aspNetCore requestTimeout="00:20:00"/>
_httpClient.Timeout = new TimeSpan(0, 5, 0);
我已经测试了当地的应用程序,不能面对这个问题,也能够得到响应,即使它需要超过3分钟的处理。
看起来,Azure web应用程序并不是等待请求被处理,如果它跨越2分钟。然而,蔚蓝会话超时指定230秒(3.8min),但它仍然没有等待,应用程序没有将此情况视为错误,也没有记录任何内容。
客户端代码:
public class ApiClientFactory
{
private static Uri ApiUrl;
private static Lazy<ApiClient> restClient = new Lazy<ApiClient>(
() => new ApiClient(ApiUrl),
LazyThreadSafetyMode.ExecutionAndPublication);
static ApiClientFactory()
{
ApiUrl = new Uri(Convert.ToString(ConfigurationManager.AppSettings["WebAPIUrl"]));
}
public static ApiClient Instance
{
get
{
return restClient.Value;
}
}
}public class ApiClient
{
private readonly HttpClient _httpClient;
private readonly Uri BaseEndPointUrl;
public ApiClient(Uri baseEndPointUrl)
{
if (baseEndPointUrl == null)
throw new ArgumentNullException("baseEndPointUrl");
BaseEndPointUrl = baseEndPointUrl;
_httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
_httpClient.Timeout = new TimeSpan(0, 5, 0); //Timeout needed for few modules to get results from db.
}
private HttpContent CreateHttpContent<T>(T content)
{
var json = JsonConvert.SerializeObject(content, MicrosoftDateFormatSettings);
return new StringContent(json, Encoding.UTF8, "application/json");
}
private static JsonSerializerSettings MicrosoftDateFormatSettings
{
get
{
return new JsonSerializerSettings
{
DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
}
}
public async Task<T1> PostAsync<T1, T2>(string url, T2 content, string token)
{
try
{
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
var response = await _httpClient.PostAsync(url, CreateHttpContent<T2>(content));
if (response.StatusCode == HttpStatusCode.InternalServerError){
var exception = await response.Content.ReadAsStringAsync();
throw new Exception(exception);
}
response.EnsureSuccessStatusCode();
var data = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T1>(data);
}
catch (Exception ex){throw ex;}
}
}如果有问题,请协助。
发布于 2020-06-01 18:17:41
您可以实现重试请求的方法,或者只需对此类错误使用.Net 波莉。不是增加超时设置的好做法。
方法:
private async Task<bool> PostAsync()//Params you need
{
HttpStatusCode[] httpStatusCodesWorthRetrying =
{
HttpStatusCode.RequestTimeout,
HttpStatusCode.InternalServerError,
HttpStatusCode.BadGateway,
HttpStatusCode.ServiceUnavailable,
HttpStatusCode.GatewayTimeout
};
var maxAttempts = 0;
while (maxAttempts < 3)
{
var response = await _httpClient.PostAsync(requestUrl, CreateHttpContent<T2>(content));
if (!httpStatusCodesWorthRetrying.Contains(response.StatusCode))
{
return true;
}
maxAttempts ++;
await Task.Delay(300);
}
return false;
}Polly
private async Task PostAsync()//Params you need
{
HttpStatusCode[] httpStatusCodesWorthRetrying =
{
HttpStatusCode.RequestTimeout,
HttpStatusCode.InternalServerError,
HttpStatusCode.BadGateway,
HttpStatusCode.ServiceUnavailable,
HttpStatusCode.GatewayTimeout
};
_retryPolicy = Policy
.Handle<HttpRequestException>()
.OrResult<HttpResponseMessage>(r => httpStatusCodesWorthRetrying.Contains(r.StatusCode))
.WaitAndRetry(4, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
_retryPolicy.Execute(await _httpClient.PostAsync(requestUrl, CreateHttpContent<T2>(content)));
}发布于 2020-01-20 12:01:41
我们认为可能的原因有以下几点。
从…
var response = await _httpClient.PostAsync(requestUrl, CreateHttpContent<T2>(content));至
var response = _httpClient.PostAsync(requestUrl, CreateHttpContent<T2>(content)).Result;注释:为Azure中的托管域启用分析选项的将为缩小这类问题提供很好的见解。
https://stackoverflow.com/questions/59702119
复制相似问题