2017-09-05 4 views
24

同じページの表のデータを操作するための「追加」フォームと「削除」フォームを含む角度のあるWebサイトを作った。角度がキャッシュを有効にしたページを更新しない

ローカルまたはChrome Dev Console(キャッシュが無効)でテストすると、新しいアイテムを追加したり削除したりすると、テーブルが自動的に更新されます。クライアントのプロダクションサーバー(IISサーバー)でテストすると、Chrome Dev Consoleを開いた状態でのみ動作します。それ以外の場合は、Ctrl + F5キーを押してキャッシュを更新し、ページに変更内容を表示する必要があります。

これは、コンポーネントのコードは次のとおりです。

addProduct() { 
    this._productsService.addProduct(this.addFormProductItem) 
     .subscribe(v => { 
     this._productsService.getProducts().subscribe( 
      products => {this.products = products, this.onChangeTable(this.config)} 
    ); 
    }); 
    this.addmodalWindow.hide(); 
    return; 
    } 


    onChangeTable(config: any, page: any = { 
    page: this.page, 
    itemsPerPage: this.itemsPerPage 
    }): any { 
    if (config.filtering) { 
     Object.assign(this.config.filtering, config.filtering); 
    } 
    if (config.sorting) { 
     Object.assign(this.config.sorting, config.sorting); 
    } 
    this.ng2TableData = this.products; 
    this.length = this.ng2TableData.length; 
    let filteredData = this.changeFilter(this.ng2TableData, this.config); 
    let sortedData = this.changeSort(filteredData, this.config); 
    this.rows = page && config.paging ? this.changePage(page, sortedData) : sortedData; 
    this.length = sortedData.length; 
    } 

私の推測では、それはいくつかのサーバー設定またはWebPACKのコードに関連するいずれかであるということです。しかし、私は後者に精通していないので、私はそれが私が使用したスタートパッケージにあったのでそのまま残しました。それは

長いファイルであるため、

私は編集1 a gist with the webpackを作成しました:いくつかの余分な調査の後、私はアプリのルートフォルダ上のweb.configファイルに以下を追加しようとしました。

<caching enabled="false" enableKernelCache="false"> 
     <profiles> 
     <add extension=".css" policy="DontCache" kernelCachePolicy="DontCache" /> 
     <add extension=".html" policy="DontCache" kernelCachePolicy="DontCache" /> 
     <add extension=".js" policy="DontCache" kernelCachePolicy="DontCache" /> 
     </profiles> 
</caching> 

しかし、私はまだ同じ動作をしています。 Dev Consoleを閉じたまま項目を追加すると、表は更新されません。しかし、私はdevのコンソールを開いてキャッシュを無効にしている場合、それは更新の必要性なしでそれを更新します。

編集2:シークレットウィンドウで作業しても問題は解決されません。

編集3: index.htmlにメタタグを追加しても問題は解決されません。

<meta http-equiv="Cache-control" content="no-cache, no-store, must-revalidate"> 
<meta http-equiv="Pragma" content="no-cache"> 

編集4:

getProducts() { 
    return this._http.get(this.API + '/products/all') 
     .map((response: Response) => <Product[]>response.json().products); 
    } 

    addProduct(product:Product) { 
    if (this._loggedInGuard.isLoggedIn()) { 
     let token = localStorage.getItem('my.token'); 
     let body = JSON.stringify(product); 
     let headers = new Headers(
     { 'Content-Type': 'application/json', 
     'Authorization': 'Bearer ' + token}); 
     return this._http 
     .post(this.API + "/products/store", body, {headers: headers}) 
     .map(res => res.json()) 
     .catch(this._responseService.catchBadResponse) 
     .do(() => this._responseService.success('Success. You added a product!')); 

    } 
    } 

編集5

私は見つけることができる唯一の解決策は、ウィンドウに私がlocation.reload(true)とのデータの更新を行うたびにリロードすることです。しかし、これはFirefox上でのみ動作し、Chromeでは動作しません。そして、私はあなたが単一ページアプリケーションを持っているこの唯一の理由を断念しなければならないということを認めません。

+0

あなたのサービスからあなたの 'getProducts()'と 'addProduct()'を表示できますか?また、コンポーネント内で 'addProduct'を2回呼び出すとどうなりますか? –

+0

質問を更新しました...製品を何回追加しても問題ありません。デベロッパーコンソールを開いたりキャッシュをクリアして更新しない限り、テーブルは同じままです。 – Tasos

+0

両方のリクエストが実行されますか? –

答えて

5

あなたが試したことのどれもが修正されていない特定の理由があります。

まず、web.configの<caching>要素を使用しても、ブラウザにレスポンスをキャッシュする方法は示されません。これは、IIS サーバーが将来の要求で再利用されるように応答をキャッシュする方法を構成するために使用されます。 Hereはそれを説明するドキュメントです。

次は、<meta>タグです。通常、キャッシュ制御は実際のHTTPヘッダーによって行われます。 <meta>タグを使用して、http応答ヘッダーで指定されていないヘッダーを設定することはできますが、NOTは既に設定されているhttpヘッダーを上書きします。IISは応答ヘッダーにキャッシングのデフォルト値を持っていますが、<meta>タグは実際に何もしません。 <meta>タグは、実際にはfile:///のURLを使って読み込んでいるときにのみ、信頼性が高くなります。

あなたがしようとしていることを確実に達成するには、実際にサーバーが使用するキャッシュコントロールヘッダーを送信する必要があります。これはサポートしようとしているブラウザによって異なる場合がありますが、角度を使用しているので、私はあなたが近代的なブラウザをサポートしていると推測します。以下は、あなたのウェブサイト内のすべての静的ファイルのキャッシングを無効にします。おそらくはあなたが望む通りではありません。ですが、ガイドとして役立つかもしれません。

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <location path="."> 
    <system.webServer> 
     <staticContent> 
     <clientCache cacheControlMode="DisableCache" /> 
     </staticContent> 
    </system.webServer> 
    </location> 
</configuration> 

ただし、最初に行うべきことは、IISが送信している現在の応答ヘッダーを調べることです。これはChromeデベロッパーツールを使用して簡単に行うことができます。返信にCache-Control:ヘッダーが表示されている場合は、<meta>タグが機能していない理由がわかります。

静的な.htmlファイルではなく、代わりにASP.NETを使用して角型アプリケーションのHTMLを生成する場合は、キャッシュヘッダーを設定するコードをコントローラに追加することをお勧めします。

Response.Cache.SetCacheability(HttpCacheability.NoCache); 

あなたはずっと年上や破損のブラウザをサポートしたい場合は、あなたが再びweb.configファイルまたはASP.NETコードを使用して行うことができ、追加する必要がありますどのような余分なヘッダを説明そこに他のリソースがあります。私はちょうど反復したい:あなたはまだあなたがサーバーによって送信されている応答ヘッダーを表示していることを確認している問題がある場合。あなたはどこにもキャッシュされたくないASP.NETページの場合

2

HttpContext.Current.Response.Cache.SetCacheability 
          (HttpCacheability.Server); 
HttpContext.Current.Response.Cache.SetNoStore(); 
Response.Cache.SetExpires(DateTime.Now); 
Response.Cache.SetValidUntilExpires(true); 

これは、サーバーがページをキャッシュするために許可されている任意のキャッシュプロキシ・サーバに指示し、それをキャッシュしないようサーバーに指示します。後の2行のコードは、ブラウザにキャッシュしないように要求します。上記のコードは、次の3つのヘッダーにつながります。

Cache-Control:no-cache, no-store 
Pragma:no-cache 
Expires:-1 

また、ブラウザのキャッシュを防ぐために、クエリ文字列に固有のものを追加することもできます。

.post(this.API + "/products/store?unique=milliseconds", body, {headers: headers}) 
+0

これはasp.netサイトではありません。それはちょうど窓サーバーです – Tasos

+0

2番目の部分(post())はあなたのためにそれを解決することができます。 –

+0

私はあなたの応答に私の答えにしたいヘッダーを追加しました。 –

1

キャッシュしたくないすべてのhttpコールにフルタイムスタンプまたは一意のIDを持つパラメータを追加します。チャンピオンのように動作します。私はAngularのテンプレートを使って同じ問題を抱えていました。私はちょうどhttpインターセプタを追加し、すべての呼び出しにタイムスタンプを追加し、問題は消えました。

関連する問題