Angular 504从服务器读取响应时超时

Angular 504从服务器读取响应时超时,angular,http-status-code-504,Angular,Http Status Code 504,我有一个角度前端和一个.NET核心后端。我有一个特别的要求,这是相当沉重,需要一段时间来执行。 当我在浏览器控制台中查看时,在从服务器读取响应时,我得到一个504:Timeout 后端完成了请求,我可以在日志中看到,在我获得超时后的某个时间段,它会返回一些JSON 首先,我尝试向angular请求添加超时标头,如下所示: const options = { headers: new HttpHeaders({ timeout: `${10000}` }) }; 这不管用 我还尝试在rx

我有一个角度前端和一个.NET核心后端。我有一个特别的要求,这是相当沉重,需要一段时间来执行。 当我在浏览器控制台中查看时,在从服务器读取响应时,我得到一个504:Timeout

后端完成了请求,我可以在日志中看到,在我获得超时后的某个时间段,它会返回一些JSON

首先,我尝试向angular请求添加超时标头,如下所示:

    const options = { headers: new HttpHeaders({ timeout: `${10000}` }) };
这不管用

我还尝试在rxjs管道中添加该函数

 this.service.getData(this.id, this.codeSystem, this.code)
    .pipe(
      timeout(120000),
      map(data=> {
       this.data = data;
      }),
      takeWhile(() => this.componentActive),
      catchError(error => {
        console.log(error);
      }))
    .subscribe();

在那之后,我尝试在IIS的高级设置下增加连接超时,但这也不起作用


在这一点上,我不知道问题在哪里或如何解决它。有人有什么想法/建议吗?

你不需要超时。您可以设置take或takeUntil,以便在收到响应之前,您的订阅是热的

callEndpoint() {
    this.service.getData.pipe(
       take(1) // wait for response
    ).subscribe( (user: User) => {
       console.log(user); // make sure you're getting a response from dataService
    });
}
此外,请检查端点是否正在获取其期望的数据:
this.id、this.codeSystem、this.code

问题出在服务器上。您无法从浏览器执行任何操作。如果服务器没有在时间限制内发送响应,大多数浏览器将自行断开连接,出于安全原因,我们无法从JavaScript中更改这一点。服务器必须发送部分正文内容以响应继续连接的请求。只要服务器忙,它就必须发送一些东西来保持连接

如果您有一个需要很长时间才能完成的API,并因此看到断开连接,那么您应该放弃期望得到JSON响应

callEndpoint() {
    this.service.getData.pipe(
       take(1) // wait for response
    ).subscribe( (user: User) => {
       console.log(user); // make sure you're getting a response from dataService
    });
}
请与API的作者联系,让他们很好地修复他们的服务器

当提出需要很长时间才能完成的请求时。最佳做法是POST启动服务,服务器用任务ID进行响应。然后每隔一段时间就可以获得该任务ID的状态更新,直到任务ID的状态报告发生了什么。然后,您可以请求服务器向客户端发送任务的输出


同时,发出请求并忽略错误。您无法通过浏览器解决此问题。

请确保您的服务请求返回承诺。比如:

getData(): Promise<Array<string>> {
    return this.http.get("http://a-test-api.com/api/getdata").toPromise();
}

takeWhile不会做同样的事情吗?这已经包含在代码中了。是的,但我正在尽量减少复制以排除故障。我不知道这是什么。componentActive。如果我的版本仍然显示该错误,请查看后端/端点以查找问题。componentActive是一个布尔值,当调用onDestroy生命周期挂钩时,该布尔值将更改为false。端点确实获得了预期的数据。我在周末为您提供了一些想法:如果您移除管道并仅订阅,您是否获得了数据?此外,我仍然对服务器/端点持怀疑态度。服务器日志是否提供了任何可能识别504的详细信息?getData返回一个可观察的,返回一个承诺并不能解决问题。谢谢,我会试试这个。我不知道这是件好事!究竟是什么安全原因导致这一切不可能?我可以想象它会使浏览器崩溃,但有多种方法可以做到这一点。