首页 > 解决方案 > 当异步请求达到 2 分钟时出现 502 错误网关

问题描述

下面描述的问题不会发生在本地开发中,只有在我将所有内容部署到托管在 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)来执行我关于如何解决它的最初想法,看看它是否按我期望的方式工作。

标签: httphttprequesthttpresponsegatewaybad-gateway

解决方案


推荐阅读