502 плохих шлюза, когда асинхронный запрос достигает 2 минут - PullRequest
1 голос
/ 30 октября 2019

Описанная ниже проблема не возникает при локальной разработке, только после того, как я развернул все для тестирования среды, размещенной в веб-приложении Azure.

При вызове конечной точки API из Angular (где я используюНаблюдатель и подпишется на запрос), запрос обрабатывается и иногда может занимать более 2 минут. Когда запрос достигает 2 минут, я сразу получаю неверный шлюз 502. Пока асинхронный процесс продолжается до завершения.

В процессе обработки запроса я выполняю пару удаленных сценариев powershell, и я убедился, что оба моих PowerShellметоды выполняются асинхронно, и убедитесь, что конечная точка API является асинхронной. В моем угловом интерфейсе, откуда я делаю запрос, я использую обозреватель и подписываюсь на выполняемый запрос.

Следующим моим шагом было желание сделать какой-то запрос, который только запускает процесс, и затем каким-то образом иметь возможностьпродолжать запрашивать до тех пор, пока я не получу ответ о том, что ответ завершен, чтобы избежать ошибки 502, но я не знаю, с чего и как начать, но я не знаю, может ли этот подход работать точно.

Backend настроен с использованием C #, .NET Core 2.2. Фронтенд угловой (7?).

Я хочу получить ожидаемый ответ вместо того, чтобы нажимать 502 Bad Gateway, каждый раз при обработке происходит 2 минуты.

Код:

Первый звонок

this.objectService.processObjectsForMerge(request).subscribe(res => {});

Который из службы готовит следующий запрос

processObjectsForMerge(req: ProcessObjectsForMergeRequest): Observable<ProcessObjectsForMergeResponse>{
return this.http.post<ProcessObjectsForMergeResponse>(this.API_URL + '/Object/ProcessObjectsForMerge',req, {
  headers: new HttpHeaders({
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + this.auth.getAccessToken()
  })
});

}

И получен в следующей конечной точке

    [HttpPost]
    [Route("ProcessObjectsForMerge/")]
    public async Task<IActionResult> ProcessObjectsForMerge([FromBody] ProcessMergeRequestModel request)
    {
        if (request == null || string.IsNullOrEmpty(request.VersionNumber) || string.IsNullOrEmpty(request.CuLevel)) return BadRequest("Failed to validate data");

        var permissionGranted = DoesUserHavePermissionForRequest(request.ShortGuid);
        if (!permissionGranted) return BadRequest();

        var isSuccessful = await new ProcessObjectsForMergeService().Process(request);
        var message = !isSuccessful ? "Failed to process objects for merge." : "Successfully processed the objects for merge.";

        return Ok(new {message, log});
    }

Обновление: Я нашел временное решение, в web.config API я смог увеличить время ожидания. Однако я считаю, что это плохая практика, поэтому я собираюсь реализовать очередь сообщений (вероятно, используя rabbitMQ), чтобы выполнить мою первоначальную идею о том, как ее решить, и посмотреть, получится ли она так, как я ожидаю.

...