2010-12-29 19 views
4

ASP.Net MVCのCSS、画像、JavaScriptファイルにExpiresヘッダを追加する方法に関するアドバイスや提案が必要です。ASP.Net MVCでヘッダの有効期限が切れる

重要な問題は、ソフトウェアが単一の場所にないことです。それはホスティングを扱うクライアントに配布されるので、やむを得ない場合を除き、IISで手動で設定する必要はありません。

私はグーグルで回り、答えの大半はコントローラを介して返されるコンテンツに焦点を当てているようです。しかし、JavaScriptファイルのためにそれを行うことはできません..

+0

なぜあなたはjavascriptファイルに対応できないのですか? –

+0

コントローラの操作によってアクセスされないためですか? – Damien

+0

他のファイル(画像、CSSなど)と同じように、コントローラの操作でアクセスできない理由はありません。物理的な* .jsファイルが要求されているように見えるルートを使用することもできます。つまり、サイト内のjavascriptファイルのURLを変更せずに行うことができます。 –

答えて

3

あなたのjavascriptファイル用のカスタムハンドラを書くことでこれを行うことができます。 MVCプロジェクトのWeb.Configファイルで、httpHandlersセクションを探します。次の行のようなものを追加します。私はこのコードをテストしていない

class CustomHandler : IHttpHandler 
{ 

    #region IHttpHandler Members 

    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     // Set any headers you like here. 
     context.Response.Expires = 0; 
     context.Response.Cache.SetExpires(DateTime.Parse("3:00:00PM")); 
     context.Response.CacheControl="no-cache"; 

     // Determine the script file being requested. 
     string path = context.Request.ServerVariables["PATH_INFO"]; 
     // Prevent the user from requesting other types of files through this handler. 
     if(System.Text.RegularExpressions.RegEx.Match(path, @"/YourScriptsFolder/[^/\\\.]*\.js")) 
      context.Response.Write(System.IO.File.ReadAllText(path)); 
    } 

    #endregion 
} 

<add verb="GET" path="/YourScriptsFolder/*.js" type="Your.Project.Namespace.And.Custom.Handler, Your.Assembly.Name" validate="false" /> 

これは、このようになりますどのカスタムハンドラを介して、そのフォルダ内のjsファイルに対するすべての要求を強制しますあなたはいくつかの問題にぶつかる可能性がありますが、これは基本的な考え方です。 ASP.Netのカスタムハンドラには、Web全体で多くの例があります。ここでは良い例です:

使用しているバージョンのIIS

http://www.developer.com/net/asp/article.php/3565541/Use-Custom-HTTP-Handlers-in-Your-ASPNET-Applications.htm

+0

乾杯!最高のアプローチを取ると思われる! – Damien

5

「手動IISの設定」であなたはIISマネージャコンソールを開くことを意味し、IIS 7.5を(と私は7と同様だと思う)場合には、唯一のweb.configファイルを使用して、静的なコンテンツにヘッダを満了し、追加することができます:

<system.webServer> 
    <staticContent> 
    <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="00:30:00" /> 
    </staticContent> 
</system.webServer> 
+0

これは、CSSファイルで参照されている画像については、(まったく)うまく動作しません。 –

+0

@EdDeGagneどうしてですか?彼らは右のヘッダーで提供されていませんか? – bluevector

+0

@Johnnyはい、適切なヘッダーでは配信されません。私はそれを正しく処理するStaticContentControllerクラスを作成しました。あなたが望むなら、私はコードを投稿することができます。 –

0

ファイルパスの最後にランダム化またはバージョン管理されたクエリ文字列を追加することはあまり複雑ではありません。

<link rel="stylesheet" type="text/css" href="somecssfile.css?version=1.0.0.3" /> 

バージョンを変更すると、ブラウザにファイルの新しいコピーが作成されます。

+0

でも、期限切れヘッダーを設定する必要があります。 – Amit

関連する問題