Описанная ниже проблема не возникает при локальной разработке, только после того, как я развернул все для тестирования среды, размещенной в веб-приложении 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), чтобы выполнить мою первоначальную идею о том, как ее решить, и посмотреть, получится ли она так, как я ожидаю.