回答:
単一のGET要求ごとにキャッシュを無効にする代わりに、$ httpProviderでグローバルに無効にします。
myModule.config(['$httpProvider', function($httpProvider) {
//initialize get if not there
if (!$httpProvider.defaults.headers.get) {
$httpProvider.defaults.headers.get = {};
}
// Answer edited to include suggestions from comments
// because previous version of code introduced browser-related errors
//disable IE ajax request caching
$httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
// extra
$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);
リクエストに一意のクエリ文字列(jQueryがcache:falseオプションを使用して行うことだと思います)をリクエストに追加することもできます。
$http({
url: '...',
params: { 'foobar': new Date().getTime() }
})
おそらくより良い解決策は、サーバーにアクセスできる場合、キャッシュを防ぐために必要なヘッダーが設定されていることを確認することです。ASP.NET MVC
この答えを使用している場合は役立つかもしれません。
$http.get(url+ "?"+new Date().toString())
パラメータを使用せず、クエリ文字列に追加するだけの別の表現です。
インターセプターを追加できます。
myModule.config(['$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('noCacheInterceptor');
}]).factory('noCacheInterceptor', function () {
return {
request: function (config) {
console.log(config.method);
console.log(config.url);
if(config.method=='GET'){
var separator = config.url.indexOf('?') === -1 ? '?' : '&';
config.url = config.url+separator+'noCache=' + new Date().getTime();
}
console.log(config.method);
console.log(config.url);
return config;
}
};
});
確認後、console.log行を削除する必要があります。
$log
、それらを取り出すのを忘れた場合に備えて使用する必要があります。
角度のあるプロジェクトでindex.htmlに3つのメタタグを追加するだけで、IEでキャッシュの問題が解決しました。
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">
index.html
IE11がAJAXリクエストをキャッシュしていることに気付いたときは、すでにこれらのメタタグ$httpProvider
がありました。
別のスレッドで私の回答を複製しています。
以下のための角度2以降、追加する最も簡単な方法no-cache
オーバーライドすることで、ヘッダを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 }
]
})
If-Modified-Since
上記の方法を使用して過去の日付を設定できると想像できます。)
headers: req.headers .set('Cache-Control', 'no-cache') .set('Pragma', 'no-cache') .set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT')
私が働いていた保証されたものはこれらの線に沿ったものでした:
myModule.config(['$httpProvider', function($httpProvider) {
if (!$httpProvider.defaults.headers.common) {
$httpProvider.defaults.headers.common = {};
}
$httpProvider.defaults.headers.common["Cache-Control"] = "no-cache";
$httpProvider.defaults.headers.common.Pragma = "no-cache";
$httpProvider.defaults.headers.common["If-Modified-Since"] = "Mon, 26 Jul 1997 05:00:00 GMT";
}]);
私はすべてのメソッドの正しい使用法を保証するために、上記のソリューションの2をマージしなければならなかったが、あなたは置き換えることができcommon
てget
、または他の方法、すなわちput
、post
、delete
異なるケースのためにこの仕事をするために。
if (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.common = {}; }
["If-Modified-Since"] = "0"
違法であり、一部のバックエンドで不良リクエストを生成します。それは日付でなければなりません。
この唯一の行は私を助けました(Angular 1.4.8):
$httpProvider.defaults.headers.common['Pragma'] = 'no-cache';
UPD:問題はIE11が積極的なキャッシングを行うことです。Fiddlerを調べたところ、F12モードではリクエストが「Pragma = no-cache」を送信しており、ページにアクセスするたびにエンドポイントがリクエストされていることに気付きました。しかし、通常モードでは、ページにアクセスしたときにエンドポイントが最初に一度だけ要求されました。
日時を乱数として追加して解決しました:
$http.get("/your_url?rnd="+new Date().getTime()).success(function(data, status, headers, config) {
console.log('your get response is new!!!');
});
上記の解決策は機能します(クエリ文字列に新しいパラメーターを追加してURLを一意にします)。、これはIEに固有ではないため、サーバーレベルでこれを処理します。つまり、そのリソースをキャッシュしない場合は、サーバーで実行します(これは、使用するブラウザーとは関係がないため、リソースに固有です)。
Javaで例えば、JAX-RSは、それを行うと、プログラムで JAX-RSのためにv1または declativly JAX-RS v2の。
誰もがそれを行う方法を理解すると確信しています
これは少し古いものですが、次のようなソリューションは廃止されました。サーバーがキャッシュを処理するかしないかを(応答で)キャッシュします。キャッシングがないことを保証する唯一の方法(本番環境での新しいバージョンについて考える)は、jsまたはcssファイルをバージョン番号で変更することです。私はこれをwebpackで行います。
また、サービスでヘッダーを設定することもできます。例:
... "@ angular / core"から{Injectable}をインポートします。 "@ angular / common / http"から{HttpClient、HttpHeaders、HttpParams}をインポートします。 ... @Injectable() クラスMyService { プライベートヘッダー:HttpHeaders; コンストラクター(プライベートhttp:HttpClient ..) { this.headers = new HttpHeaders() .append( "Content-Type"、 "application / json") .append( "承諾"、 "アプリケーション/ json") .append( "LanguageCulture"、this.headersLanguage) .append( "Cache-Control"、 "no-cache") .append( "プラグマ"、 "キャッシュなし") } } ....
正しいサーバー側のソリューション:AngularJSでIEキャッシュを防ぐためのより良い方法?
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]
public ActionResult Get()
{
// return your response
}
この問題は、あなたが言ったようにIEキャッシュの問題が原因です。f12を押すと、IEデバッグモードでテストできます(これはデバッグモードで正常に動作します)。IEは、ページが呼び出されるたびにサーバーデータを取得しません。キャッシュからのデータ。これを無効にするには、次のいずれかを実行します。
//前(発行済み)
this.httpService.get(this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName、{})
//後(正常に動作)
this.httpService.get(this.serviceUrl + "/eAMobileService.svc/ValidateEngagmentName/" + engagementName + "?DateTime =" + new Date()。getTime()+ ''、{cache:false})
$ httpProvider.defaults.headers.common ['Pragma'] = 'no-cache';
If-Modified-Since
ヘッダは、IIS +はすべてのhtmlファイル400不正なリクエストを投げるiisnodeせて読み込まngInclude
とngView
。(私は、キャッシングの問題を持っていなかったクロム、からそれらを引っ張っ)ものの、次の2つのヘッダは私のために問題を修正:$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';