2011-01-19 17 views
7

可能性の重複:
CSS in App_Theme folder gets Cached in BrowserAsp.Netテーマを使用しているときにブラウザにキャッシュされたCSSファイルを再ロードさせるにはどうすればよいですか?

私は「What is an elegant way to force browsers to reload cached CSS/JS files?」を見てきましたが、そこに答えはPHPを使用し、それはCSSがASPによって動的に注入されているという事実に対応していません。 .Netテーマ。

+0

こんにちはホーマー、 の<configuration>セクションにこれを追加します。 ブラウザが推測すると、cssファイルがキャッシュされ、変更が反映されていれば新しいバージョンが取得されます。私の考えは、使用されておらず、テーマごとに異なるクラスをCSSファイルに持たせることです。このクラスが各cssファイルの先頭にある場合、ブラウザはそれを読み込み、別のクラス名を参照してcssファイルを再ダウンロードします。 これはもちろん、すべての前提に基づいており、インターネットエクスプローラキャッシュのCSSに関する知識はありません。 誰かがこれについて権威をもって話すことができるのであれば、私も興味があります! – WraithNath

+0

私はちょっと混乱しています - 別のテーマを使用すると、スタイルシートは別のフォルダ、つまり/App_Themes/blue/stylesheet.css対/App_Themes/red/stylesheet.cssにあります。そのディレクトリの変更は、キャッシュされないようにするのに十分です。さてもちろん、赤/スタイルシート。cssはまだキャッシュされますが、テーマを青色にスワップすると青色のテーマ(キャッシュされる可能性があります)がロードされます。 – Prescott

+0

私はテーマを交換しているわけではなく、CSSファイルを変更しています。 – Homer

答えて

13

私は迅速かつ汚れた解決策があると思います。 (例えばPreRenderフェーズの)ページヘッダー内のコントロールを調べ、App_Themesフォルダの下にあるCSSファイルを指すリンクを見つけて(クエリ文字列にランダムな情報を追加することによって)動的にします。これにより、キャッシュされたバージョンのファイルを無効にするようブラウザに指示する可能性が高くなります。

コード:

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    HtmlLink link = null; 

    foreach (Control c in Header.Controls) 
    { 
     if (c is HtmlLink) 
     { 
      link = c as HtmlLink; 

      if (link.Href.IndexOf("App_Themes/", StringComparison.InvariantCultureIgnoreCase) >= 0 && 
       link.Href.EndsWith(".css", StringComparison.InvariantCultureIgnoreCase)) 
      { 
       link.Href += string.Format("?t={0}", DateTime.Now.Ticks.ToString()); 
      } 
     } 
    } 
} 

出力:あなたはHeaderプロパティにアクセスできるようにするために、ページのマークアップで宣言さ<head runat="server">を持っている必要があります

<link href="App_Themes/MyTheme/MyTheme.css?t=634310637798128189" 
     type="text/css" rel="stylesheet" /> 

注意(それ以外の場合null)。

+0

この方法は、ユーザーがページを閲覧するたびにファイル名が異なるため、CSSのブラウザキャッシングを完全に削除することになります。とにかく、私はブラウザがクエリ文字列のパラメータでファイルをキャッシュしないことを読んだ。 – Homer

+0

@Homer:これらのファイルをキャッシュする可能性があります。実装に依存します。 URI(URLではない)が決して変更されない場合、ファイルをキャッシュしないでください。 – volpav

+0

@Homer、この基本的なアイデアは私のために働いたが、私は少し変えなければならなかった。 OnPreRender(オブジェクト送信者、EventArgs e) また、メソッドが終了する前に基本メソッドを呼び出す必要があります。 –

1

SERVER側が強制的にリロードする方法を尋ねる場合... 1つの方法は、CSS/JSのファイル名を動的に変更して、ページへの後続の呼び出しで別のファイルが必要になるようにすることです。

<sarcasm> 他は単純に終了し、サイトへの変更を行うときCTRL-F5 :) </sarcasm>

+0

ASP.Netでこれを行うにはどうすればいいですか(CTRL-F5ではなくファイル名を動的に変更します)? – Homer

+2

私が使用した方法の1つは、特定のパターン(/css/mycssfile.201104056554433.css)のファイルに対するリクエストをタイムスタンプを持たない実際のファイルにリダイレクトすることです。この方法では、ブラウザは各要求を一意のファイルの要求として扱い、サーバは実際のタイムスタンプに関係なく、盲目的にファイルの要求を返すことができます。各リクエストで要求されているcssファイル名を動的に変更するには、aspページで覚えておくだけです(各リクエストで現在のタイムスタンプを挿入するだけです)。 – Dekker500

1

を押して手動でCSSの名前を変更するには、ユーザーに伝えることです。

1

私はまだApp_Themesファイルをバージョンアップする方法は見つけられませんでしたが、比較的短い時間(たとえば10秒)で期限切れにすることができます。キャッシュのパフォーマンス上の利点ファイルが変更されていない場合、サーバーは304 - Not Modifiedと応答するので、ブラウザーがファイルを要求してもトラフィックは減少します。

は、私は、これはそのわずか理論として仕事をしたりしませんか知らないのWeb.Config

<location path="App_Themes"> 
    <system.webServer> 
     <staticContent> 
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="00:00:10" /> 
     </staticContent> 
    </system.webServer> 
</location> 
関連する問題