24

У меня есть конечная точка отдыха, которая возвращает список при вызове GET. У меня также есть конечная точка POST для добавления новых элементов и DELETE для их удаления. Это работает в Firefox и Chrome, а POST и DELETE работают в IE11. Однако GET в IE11 работает только при начальной загрузке страницы. Обновление данных кэшируется. Я видел сообщение об этом поведении в Angular 1, но ничего для Angular 2 (кандидат на выпуск 1).Предотвращение кэширования IE11 GET-вызов в Angular 2

+3

Если GET апи не определяет заголовок управления Cache -> Это означает, что ответ кэшируется, если состояние 200 OK. – Loc

+3

См. Также http://stackoverflow.com/questions/36500804/proper-way-to-prevent-angular2-http-request-caching-in-internet-explorer-ie для обхода на стороне клиента. –

+0

@Loc Я добавил значения Cache-Control no-store и no-cache и все равно получаю одинаковый результат только в IE. – cmaynard

ответ

17

Как ответил here, вы можете просто переопределить RequestOptions добавить заголовки необходимо:

import { Injectable } from '@angular/core'; 
import { BaseRequestOptions, Headers } from '@angular/http'; 

@Injectable() 
export class CustomRequestOptions extends BaseRequestOptions { 
    headers = new Headers({ 
     'Cache-Control': 'no-cache', 
     'Pragma': 'no-cache', 
     'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT' 
    }); 
} 

Модуль:

@NgModule({ 
    ... 
    providers: [ 
     ... 
     { provide: RequestOptions, useClass: CustomRequestOptions } 
    ] 
}) 
+1

Это отличное решение для того, чтобы сделать все запросы с углового запроса без кеша, однако я не хочу этого поведения для всех запросов, так как некоторые запросы могут быть кэшированы просто отлично. Я пошел с настройкой соответствующей серверной части заголовков. Я бы предпочел, чтобы у сервера были кеширующие смартфоны. Возможно, я неправильно сформулировал этот вопрос. – cmaynard

+1

@cmaynard Я столкнулся с вашим вопросом, глядя на то, как настроить глобальное кэширование для Andular, поэтому с точки зрения Google ваша формулировка идеально подходит для поиска чего-то ищущего :) –

6

Вперед ответ от stackoverflow Angular IE Caching issue for $http вы должны добавить заголовки «Pragma», «no-cache», «If-Modified-Since» для каждого запроса «GET».

Сценарий перехватчика больше не поддерживается угловым 2. Поэтому вы должны расширить http, как описано здесь What is httpinterceptor equivalent in angular2?.

Угловой 4.3 теперь включает в себя услугу HttpClient, которая поддерживает перехватчики.

0

Немного поздно, но я столкнулся с той же проблемой. Для Angular 4.X Я написал пользовательский класс Http для добавления случайного числа до конца, чтобы предотвратить кеширование IE. Он основан на 2-й ссылке по димерам (What is httpinterceptor equivalent in angular2?). Предупреждение: не гарантируется 100% ошибка.

import { Injectable } from '@angular/core'; 
import { Observable } from 'rxjs/Observable'; 
import { Http, Response, XHRBackend, RequestOptions, RequestOptionsArgs, 
URLSearchParams } from '@angular/http'; 

@Injectable() 
export class NoCacheHttp extends Http { 
    constructor(backend: XHRBackend, options: RequestOptions) { 
     super(backend, options); 
    } 

    get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
     //make options object if none. 
     if (!options) { 
      options = { params: new URLSearchParams() }; 
     } 
     //for each possible params type, append a random number to query to force no browser caching. 
     //if string 
     if (typeof options.params === 'string') { 
      let params = new URLSearchParams(options.params); 
      params.set("k", new Date().getTime().toString()); 
      options.params = params; 

     //if URLSearchParams 
     } else if (options.params instanceof URLSearchParams) { 
      let params = <URLSearchParams>options.params; 
      params.set("k", new Date().getTime().toString()); 

     //if plain object. 
     } else { 
      let params = options.params; 
      params["k"] = new Date().getTime().toString(); 
     } 
     return super.get(url, options); 
    } 
} 
+0

Я использовал эту технику в прошлом, чтобы «обмануть» кеширование. Я думаю, что это полезно, но обычно лучше устанавливать соответствующие заголовки. – cmaynard

2

Сегодня я также имел эту проблему, (черт IE) , В моем проекте я использую httpclient, который не имеет BaseRequestOptions. Чтобы решить эту проблему, мы должны использовать Http_Interceptor.

export class CustomHttpInterceptorService implements HttpInterceptor { 
    intercept(req: HttpRequest<any>, next: HttpHandler): 
    Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> { 
    const nextReq = req.clone({ 
     headers: req.headers.set('Cache-Control', 'no-cache') 
     .set('Pragma', 'no-cache') 
     .set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT') 
     .set('If-Modified-Since', '0') 
    }); 

    return next.handle(nextReq); 
} 

модуль обеспечивает

@NgModule({ 
    ... 
    providers: [ 
     ... 
     { provide: HTTP_INTERCEPTORS, useClass: CustomHttpInterceptorService, multi: true } 
    ] 
}) 
+0

Спасибо, это правильный ответ для Angular 5. Однако с тех пор Я определил Угловое 2 в исходном вопросе, я оставлю этот ответ, помеченный правильно для этого вопроса, имеет upvote! – cmaynard

Смежные вопросы