下面描述的问题不会发生在本地开发中,只有在我将所有内容部署到托管在 Azure Web App 上的测试环境后。
从 Angular 调用 API 端点时(我使用 Observer 并订阅请求),请求被处理,有时可能需要超过 2 分钟才能处理。当请求达到 2 分钟时,我立即得到一个 502 bad gateway,而异步过程一直持续到完成。
在请求处理中,我执行了几个远程 powershell 脚本执行,我确保我的两个 powershell 方法异步运行,并确保 API 端点是异步的。在我发出请求的角度前端中,我使用观察者并订阅正在发出的请求。
我的下一步是想要发出某种请求来启动该过程,然后以某种方式能够继续请求,直到我得到响应已完成的响应,以避免 502 错误,但我不知道在哪里或如何开始,但我不知道这种方法是否可以确定。
后端使用 C#、.NET Core 2.2 设置。前端是 Angular(7?)。
我想获得预期的响应,而不是每次处理达到 2 分钟时都点击 502 Bad Gateway。
代码:
首先我打电话
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});
}
更新: 我找到了一个临时解决方案,在 API 的 web.config 中,我能够增加超时时间。不过我觉得这是不好的做法,所以要实现一个消息队列(可能使用rabbitMQ)来执行我关于如何解决它的最初想法,看看它是否按我期望的方式工作。