【问题标题】:Increase timeout in Angular 2+ and ASP.NET Core WebAPI application增加 Angular 2+ 和 ASP.NET Core WebAPI 应用程序的超时时间
【发布时间】:2019-03-05 18:05:23
【问题描述】:

在我的 Angular 2+ / ASP.NET Core MVC WebAPI 应用程序中,我有一个从客户端 UI 到服务器的长时间运行的 API 调用。请求在 30 秒后超时。我想为这个特定的 API 调用定义客户端或服务器端的超时时间。

我只找到了全局配置服务器超时的方法,这不是我想要的,因为 30 秒超时对于其他调用来说很好。我还找到了通过管道 RxJS 的 timeout 运算符来减少客户端超时的解决方案。但是,据我了解,这不适合in增加超时时间?

如何设置此特定请求的超时时间? 30 秒的默认值从何而来?

(代码实际上并不重要,因为它是一个标准的 API 控制器和一个标准的 Angular HTTP 调用):

this.http.get('api/xyz').subscribe(d => { ... });

【问题讨论】:

标签: c# angular asp.net-core asp.net-core-webapi


【解决方案1】:

要解决超时问题,您可以使用 RxJs 中的timeout,如下所示

以毫秒为单位将时间传递给timeout 操作员

这里我将 60 秒作为超时,所以在 60 秒后如果服务器没有响应,则会抛出超时错误。

import ‘rxjs/add/operator/timeout’; 

...

this.http.get('api/xyz').timeout(60000).subscribe(d => { ... });

【讨论】:

  • 我正在使用 post 但它不起作用。有什么解决办法吗?
【解决方案2】:

看来,如果不扩展 HttpClientModule 类,拦截器与相应请求进行通信的唯一预期方式是 paramsheaders 对象。

由于超时值是标量,因此可以安全地将其作为自定义标头提供给拦截器。

import { Inject, Injectable, InjectionToken } from '@angular/core';
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';
import { timeout } from 'rxjs/operators';

export const DEFAULT_TIMEOUT = new InjectionToken<number>('defaultTimeout');

@Injectable()
export class TimeoutInterceptor implements HttpInterceptor {
  constructor(@Inject(DEFAULT_TIMEOUT) protected defaultTimeout: number) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const timeoutValue = Number(req.headers.get('timeout')) || this.defaultTimeout;

    return next.handle(req).pipe(timeout(timeoutValue));
  }
}

这可以在您的应用模块中进行配置,例如:

...
providers: [
  [{ provide: HTTP_INTERCEPTORS, useClass: TimeoutInterceptor, multi: true }],
  [{ provide: DEFAULT_TIMEOUT, useValue: 30000 }]
],  
...

然后使用自定义超时标头完成请求

http.get(..., { headers: new HttpHeaders({ timeout: `${20000}` }) });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多