ASP.NET Core アプリケーションの静的ファイルのレスポンスヘッダに値を追加、変更する

ASP.NET Core アプリケーションの静的ファイルのレスポンスヘッダに値を追加、変更するコードを紹介します。

概要

こちらの記事でASP.NET Core Webアプリケーションで静的ファイルを扱えるようにする設定を紹介しました。
この記事では、静的ファイルのレスポンス時のレスポンスヘッダの値を追加、変更するコードを紹介します。

事前準備

こちらの記事を参照して、静的ファイルにアクセスできる、ASP.NET Coreアプリケーションを作成します。

プログラム:レスポンスヘッダを追加

ファイルの追加

今回プロジェクトにテスト用のファイル、info.txtを追加します。 ファイルの内容は以下です。

Penguin-Cookie : 180
Duck-Cake : 550
WhiteBear-Icecream : 320 

コード

以下のコードを記述します。

Program.cs
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 Core アプリケーションの静的ファイルのレスポンスヘッダに値を追加、変更する:画像1

開発ツールでレスポンスヘッダを確認します。ASP.NETアプリケーションで実装した cache-control: public, max-age=120 が設定されている動作が 確認できます。
ASP.NET Core アプリケーションの静的ファイルのレスポンスヘッダに値を追加、変更する:画像2

なお、変更前の状態の結果は下図です。レスポンスヘッダに cache-control は設定されていません。
ASP.NET Core アプリケーションの静的ファイルのレスポンスヘッダに値を追加、変更する:画像3

プログラム:レスポンスヘッダを変更

レスポンスヘッダを変更する場合は、レスポンスヘッダの項目を削除した後に追加することで対応できます。

コード

以下のコードを記述します。

Program.cs
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 にアクセスします。下図のページが表示されます。
ASP.NET Core アプリケーションの静的ファイルのレスポンスヘッダに値を追加、変更する:画像4

開発ツールでレスポンスヘッダを確認します。Content-Typeヘッダの値がASP.NETアプリケーションで実装した Content-Type: text/application に変更されている動作が確認できます。
ASP.NET Core アプリケーションの静的ファイルのレスポンスヘッダに値を追加、変更する:画像5

info.txtではない他のファイルにアクセスします。下図は、static.htmlファイルを表示した場合の結果です。 開発ツールでレスポンスヘッダを確認すると。Content-Typeヘッダの値はtext/html になっており、info.txt以外のファイルでは、 元のContent-Typeの値が返される動作が確認できます。

ASP.NET Core アプリケーションの静的ファイルのレスポンスヘッダに値を追加、変更する:画像6

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2023-05-10
Copyright © 1995–2025 iPentec all rights reserverd.