LoginSignup
8
3

More than 3 years have passed since last update.

ASP.NET Coreで静的コンテンツを提供する

Posted at

はじめに

今回は、HTML、CSS、画像、および、JavaScript などの静的ファイルはアプリケーションで扱う方法について調べてみました。
扱わないアプリなんてほぼ皆無だと思いますので、これは必須な知識のはず。

なお、環境を.NET Core 3.1に上げました。

wwwroot内のファイルの場合

Startup.csのConfigureメソッドにある、UseStaticFilesメソッドの呼び出しをすることで、wwwrootフォルダ以下にあるファイルを提供することができます。

app.UseStaticFiles();

view側で、ここにあるファイルにアクセスする際は、以下のような記述をします。

<img src="~/images/sample.jpeg" alt="サンプル画像" />

~/wwwroot を指します。ですからこれで、wwwroot/images/example.jpg を参照することになります。

wwwroot外のファイルの場合

wwwroot内のファイルに加えて、別のフォルダ内の静的ファイルも提供したい場合は、Configureメソッドで、以下のようなコードを書きます。

  app.UseStaticFiles(); 

  app.UseStaticFiles(new StaticFileOptions
  {
      FileProvider = new PhysicalFileProvider(
          Path.Combine(Directory.GetCurrentDirectory(), "StaticFiles")),
        RequestPath = "/StaticFiles"
  });

上の例は、StaticFiles フォルダの例です。最初の "StaticFiles" は、物理フォルダの名前で、2番目の"/StaticFiles"は、ルーティングのパスを指定します。
ここでは同じ名前にしましたが、別の名前でもかまいません。

では、試してみます。プロジェクトの直下に、StaticFiles フォルダを作成し、その下に Images フォルダを作成します。
このフォルダの下に、任意の画像ファイルを入れます。

チュートリアルで作成したindex.cshtml に以下のタグを追加します。

<img src="/staticfiles/images/sample.jpeg" alt="サンプル画像" />

実行してみます。
無事、画像が表示されました。

スクリーンショット 2019-12-19 21.18.16.png

試しに、

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(
        Path.Combine(Directory.GetCurrentDirectory(), "StaticFiles")),
    RequestPath = "/StaticFiles"
});

の部分をコメントアウトしてみます。

画像は表示されません。staticsfiles フォルダにはアクセスできないのが確認できます。

スクリーンショット 2019-12-19 21.19.56.png

HTTP 応答ヘッダーの設定

まず、以下のコマンドで、Microsoft.AspNetCore.Httpパッケージをインストールします。

dotnet add package Microsoft.AspNetCore.Http --version 2.2.2

次に、StartUp.cs のConfigureメソッドを書き換えます。

using Microsoft.AspNetCore.Http;



    var  cachePeriod = 600;
    app.UseStaticFiles(new StaticFileOptions
    {
        OnPrepareResponse = ctx =>
        {
            ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cachePeriod}");
        }
    });

こうすると、Response HeaderにCache-Controlの値を設定できます。この例では、600秒間キャッシュを有効にしています。

ブラウザで確認すると、確かにCache-Control が設定されているのが確認できます。

スクリーンショット 2019-12-21 13.32.36.png

上の例では、PhysicalFileProviderでの指定がないので、wwwroot配下のファイルに限定されます。

ディレクトリ参照の有効化

通常のWebアプリではこの機能は不要ですが、時には、ディレクトリの参照を有効にしたい場合があります。

Startup.Configure で UseDirectoryBrowser メソッドを呼び出すと、ディレクトリの参照を有効にできます。

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(
        Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "myimages")),
    RequestPath = "/images"
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
    FileProvider = new PhysicalFileProvider(
        Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "myimages")),
    RequestPath = "/images"
});

上のコードでは、app.UseStaticFilesで、/wwwroot/myimages フォルダ配下の静的ファイルを提供し、app.UseDirectoryBrowserで、ディレクトリの参照を有効化することで、ブラウザ上でフィルを閲覧できるようになります。
"/images"がルーティングのパスを指定です。

以下、ブラウザの表示例です。

スクリーンショット 2019-12-21 14.15.08.png

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3