504 Тайм-аут при чтении ответа с сервера - PullRequest
0 голосов
/ 11 июня 2019

У меня есть угловой интерфейс и .NET CORE. У меня есть один конкретный запрос, который довольно тяжелый и требует времени для выполнения. Когда я смотрю в консоль браузера, я получаю 504: Тайм-аут при чтении ответа с сервера.

Бэкэнд завершает запрос, я вижу в журнале, что он возвращает некоторый JSON через определенное время (где-то после того, как я получаю время).

Сначала я попытался добавить заголовок тайм-аута к угловому запросу следующим образом:

    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, это также не сработало.

На данный момент я не уверен, где находится проблема или как ее решить. У кого-нибудь есть идея / предложение?

Ответы [ 3 ]

0 голосов
/ 13 июня 2019

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

Если у вас есть API, выполнение которого занимает много времени, и в результате вы видите отключение , то выдолжен отказаться от ожидания получения ответа JSON.

Свяжитесь с автором API и попросите его исправить их сервер.

При выполнении запроса, который требуетдлительное время для завершения.Рекомендуется POST запустить службу, и сервер отвечает ИД задачи .Затем вы GET обновляете статус для этого идентификатора задачи через определенные промежутки времени, пока состояние идентификатора задачи не сообщит о произошедшем.Затем вы можете запросить сервер отправить клиенту вывод из задачи.

Тем временем выполнить запрос и игнорировать ошибки.Вы не можете решить эту проблему из браузера.

0 голосов
/ 13 июня 2019

Убедитесь, что ваш сервис запрос на возврат обещания.Нравится:

getData(): Promise<Array<string>> {
    return this.http.get("http://a-test-api.com/api/getdata").toPromise();
}
0 голосов
/ 11 июня 2019

Вам не нужно время ожидания.Вы можете установить 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

...