ASP.NET Core アプリケーションの静的ファイルのレスポンスヘッダに値を追加、変更するコードを紹介します。
こちらの記事でASP.NET Core Webアプリケーションで静的ファイルを扱えるようにする設定を紹介しました。
この記事では、静的ファイルのレスポンス時のレスポンスヘッダの値を追加、変更するコードを紹介します。
こちらの記事を参照して、静的ファイルにアクセスできる、ASP.NET Coreアプリケーションを作成します。
今回プロジェクトにテスト用のファイル、info.txt
を追加します。
ファイルの内容は以下です。
Penguin-Cookie : 180
Duck-Cake : 550
WhiteBear-Icecream : 320
以下のコードを記述します。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseStaticFiles(new StaticFileOptions {
OnPrepareResponse = ctx => {
ctx.Context.Response.Headers.Append("Cache-Control", "public, max-age=120");
}
});
app.MapGet("/", () => "Hello World!");
app.Run();
UseStaticFiles()メソッドの呼び出しのパラメーターに StaticFileOptions オブジェクトを渡します。
StaticFileOptions のOnPrepareResponse イベントを実装します。
OnPrepareResponse イベントにデリゲートメソッドを設定し、
メソッド内で、Context.Response.Headers.Append()
メソッドを呼び出すことで、レスポンスヘッダに項目を追加できます。
app.UseStaticFiles(new StaticFileOptions {
OnPrepareResponse = ctx => {
ctx.Context.Response.Headers.Append("Cache-Control", "public, max-age=120");
}
});
ラムダ式を使用しない、以下のコードでも動作します。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
StaticFileOptions sfo = new StaticFileOptions();
sfo.OnPrepareResponse = func;
app.UseStaticFiles(sfo);
app.MapGet("/", () => "Hello World!");
app.Run();
void func(Microsoft.AspNetCore.StaticFiles.StaticFileResponseContext ctx) {
ctx.Context.Response.Headers.Append("Cache-Control", "public, max-age=120");
}
プロジェクトを実行し、(アプリケーションルートURL)/info.txt
にアクセスします。
下図のページが表示されます。
開発ツールでレスポンスヘッダを確認します。ASP.NETアプリケーションで実装した cache-control: public, max-age=120
が設定されている動作が
確認できます。
なお、変更前の状態の結果は下図です。レスポンスヘッダに cache-control
は設定されていません。
レスポンスヘッダを変更する場合は、レスポンスヘッダの項目を削除した後に追加することで対応できます。
以下のコードを記述します。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseStaticFiles(new StaticFileOptions {
OnPrepareResponse = ctx => {
ctx.Context.Response.Headers.Append("Cache-Control", "public, max-age=120");
if (ctx.Context.Request.Path.Value == "/info.txt") {
ctx.Context.Response.Headers.Remove("Content-Type");
ctx.Context.Response.Headers.Append("Content-Type", "text/application");
}
}
});
app.MapGet("/", () => "Hello World!");
app.Run();
今回の例では、(アプリケーションルートURL)/info.txt
にアクセスした際に、デフォルトのMIME Typeのtext/plain
ではなく、
text/application
に変更したいです。
先の実装と同様にUseStaticFiles()メソッドの呼び出しのパラメーターに StaticFileOptions オブジェクトを渡します。
StaticFileOptions のOnPrepareResponse イベントを実装します。
OnPrepareResponse イベント内で、Context.Request.Path.Value
の値を確認し、アクセスしたファイルが/info.txt
であった場合は、Context.Response.Headers.Remove()
を呼び出し、"Content-Type"ヘッダを削除した後、
Context.Response.Headers.Append()
を呼び出し、"Content-Type"ヘッダに "text/application" を設定します。
app.UseStaticFiles(new StaticFileOptions {
OnPrepareResponse = ctx => {
ctx.Context.Response.Headers.Append("Cache-Control", "public, max-age=120");
if (ctx.Context.Request.Path.Value == "/info.txt") {
ctx.Context.Response.Headers.Remove("Content-Type");
ctx.Context.Response.Headers.Append("Content-Type", "text/application");
}
}
});
プロジェクトを実行し (アプリケーションルートURL)/info.txt
にアクセスします。下図のページが表示されます。
開発ツールでレスポンスヘッダを確認します。Content-Typeヘッダの値がASP.NETアプリケーションで実装した
Content-Type: text/application
に変更されている動作が確認できます。
info.txtではない他のファイルにアクセスします。下図は、static.htmlファイルを表示した場合の結果です。
開発ツールでレスポンスヘッダを確認すると。Content-Typeヘッダの値はtext/html
になっており、info.txt以外のファイルでは、
元のContent-Typeの値が返される動作が確認できます。