Увеличение времени ожидания в приложениях Angular 2+ и ASP.NET Core WebAPI - PullRequest
1 голос
/ 05 марта 2019

В моем приложении Angular 2+ / ASP.NET Core MVC WebAPI у меня длительный API-вызов из клиентского интерфейса на сервер.Время ожидания запроса истекает через 30 секунд.Я хотел бы определить тайм-аут для этого конкретного вызова API на стороне клиента или на сервере.

Я нашел только способы настройки тайм-аута сервера глобально, а это не то, что мне нужно, как 30-секундный тайм-аутхорошо для других звонков.Я также нашел решения по уменьшению тайм-аута на стороне клиента путем передачи оператора RxJS timeout.Однако, насколько я понимаю, это не подходит для при увеличении времени ожидания?

Как я могу установить время ожидания для этого конкретного запроса?Откуда берется 30-секундное значение по умолчанию?

(Код на самом деле не имеет значения, поскольку это стандартный контроллер API и стандартный угловой HTTP-вызов):

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

Ответы [ 2 ]

2 голосов
/ 05 марта 2019

Для решения проблемы тайм-аута вы можете использовать timeout из RxJ, как показано ниже

Время передачи в миллисекундах для timeout оператора

Здесь я передаю 60 секунд в качестве тайм-аута, поэтомучерез 60 секунд, если от сервера не будет ответа, произойдет ошибка тайм-аута.

import ‘rxjs/add/operator/timeout’; 

...

this.http.get('api/xyz').timeout(60000).subscribe(d => { ... });
1 голос
/ 05 марта 2019

Похоже, что без расширения классов HttpClientModule единственными ожидаемыми способами взаимодействия перехватчиков с соответствующими запросами являются объекты params и headers.

Поскольку значение времени ожидания является скалярным, оно может быть безопаснопредоставляется в качестве настраиваемого заголовка для перехватчика.

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}` }) });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...