У меня есть клиентское приложение, построенное на Asp. net ядро MVC (V 1.1.1) и веб-API, построенное на Asp. net ядро (v 2.1). Я принимал оба на Azure.
При выполнении некоторых запросов веб-приложение завершается с ошибкой и выдает 502 неверный шлюз.
Код состояния ответа не указывает на успех: 502 (плохой шлюз).
В указанном приложении CGI обнаружена ошибка, и сервер завершил процесс.
Эта проблема периодически, однако, она возникает, когда запрос обрабатывается более 2 минут. Я установил requestTimeout на 20 минут как на стороне клиента, так и на стороне API в файле Web.config, но решение так и не получилось. Иногда один и тот же запрос обрабатывается за меньшее время, и я получаю ответ.
Кроме того, 5-минутный тайм-аут для Httpclient также был установлен, но не повезло.
<aspNetCore requestTimeout="00:20:00"/>
_httpClient.Timeout = new TimeSpan(0, 5, 0);
Я протестировал приложение локально и не могу решить эту проблему, также могу получить ответ, даже если это займет более 3 минут
Кажется, что Azure веб-приложение не ожидает обработки запроса, если оно пересекает 2 мин. Тем не менее, время ожидания сеанса azure указывает 230 секунд (3,8 мин), но все же оно не ожидает, и приложение не рассматривает этот случай как ошибку и ничего не регистрирует.
Код на стороне клиента:
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;}
}
}
Пожалуйста, помогите, где есть проблемы.