ASP.NETを使用してコードでExpiresヘッダーをプログラムで設定する方法はありますか?具体的には、フォルダー全体とすべてのサブフォルダーに設定する必要があります。フォルダーには静的ファイル(JavaScript、CSS、画像など)のみが含まれ、aspxファイルは含まれないため、aspxコードにコードを追加することはできません。 -page_loadの背後。
通常、これはIISで直接設定できます。ただし、サーバーはクライアントによってロックダウンされており(展開用のWebアプリディレクトリへのFTPアクセスしかありません)、クライアントにIISでExpiresヘッダーを設定させるには氷の時代がかかります(これは公共部門/政府のサイトです)。
Yahooの推奨事項http://developer.yahoo.com/performance/rules.html#expiresに従って、フロントエンドの最適化の理由でこれを行っています。
更新: HttpModuleを作成してみました...
public class FarFutureExpiresModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
string url = context.Request.Url.ToString();
if (url.Contains("/StaticContent/"))
{
context.Response.Cache.SetExpires(DateTime.Now.AddYears(30));
}
}
}
これはうまくいかないようですが。コードにブレークポイントを設定しましたが、正しく実行されているように見えます。ただし、Firefoxで生のHTTPヘッダー情報を分析すると、expires値が設定されていません。BeginRequestを使用していることに注意してください。ただし、PostReleaseRequestStateとPreSendRequestHeadersにもフックしようとしましたが、どちらも機能していないようです。何か案は?
アップデート2:わかりました。IIS6を実行しているため、HttpModulesは静的ファイルでは実行されず、動的ファイル(* .aspxなど)でのみ実行されます。RickNZの助けのおかげで、私は次のIHttpModuleを思いついた。
public class FarFutureExpiresModule : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
string url = context.Request.Url.ToString();
if (url.Contains("/StaticContent/"))
{
context.Response.Cache.SetExpires(DateTime.Now.AddYears(30));
context.Response.Cache.SetMaxAge(TimeSpan.FromDays(365.0 * 3.0));
}
}
}
...動作しているように見えますが、Visual Studioの組み込みWebサーバーとIIS7(統合パイプラインモードの場合)でのみ機能します。同僚は、静的ファイルでHttpModulesを機能させるためにIIS6でワイルドカードマッピングを設定することについて言及しましたが、IIS6にアクセスできる場合は、Far-Future Expiresヘッダーを直接設定するだけで、このHttpModuleを気にする必要はありません。しかたがない!