Получение «Код состояния ответа не означает успех: 502 (Bad Gateway)» из Asp. net Core MVC Веб-приложение, размещенное в Azure - PullRequest
0 голосов
/ 12 января 2020

У меня есть клиентское приложение, построенное на 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;}
   }
}

Пожалуйста, помогите, где есть проблемы.

1 Ответ

0 голосов
/ 20 января 2020

Мы думали, что возможными причинами могут быть следующие:

  1. Во время тестирования возникла проблема, связанная с сетью, между двумя размещенными приложениями при обработке данного запроса и доставке ответа. Прежде чем API доставит ответ, веб-приложение может отключиться.
  2. Произведено следующее изменение кода в клиентском классе API. (он опубликован в вопросе). Я не уверен в тонкой разнице между в ожидании задачи и получением Result из задачи. Но после этого изменения мы больше не испытывали проблему, кроме того, провели некоторое нагрузочное тестирование, но все равно не столкнулись с этим позже.

С

var response =  await _httpClient.PostAsync(requestUrl, CreateHttpContent<T2>(content));

До

var response =  _httpClient.PostAsync(requestUrl, CreateHttpContent<T2>(content)).Result;

Примечание: Включение параметров Google Analytics для размещенных доменов в Azure даст нам хорошее представление о том, как сузить этот тип проблем.

...