ASP.NET Core 服务静态文件

在这里,我们将学习如何在 HTTP 请求上提供静态文件,如 Html、JavaScript、CSS 或图像文件,而无需任何服务器端处理。

默认情况下,ASP.NET Core 应用程序无法提供静态文件。我们必须在请求管道中包含 Microsoft.AspNetCore.StaticFiles 中间件。

安装 StaticFiles 中间件

Microsoft.AspNetCore.StaticFiles 中间件包已包含在元包 Microsoft.AspNetCore.All 中。所以我们不需要在 ASP.Net Core 3.X 应用程序中单独安装它。


使用 StaticFiles 中间件

默认情况下,web 应用程序的所有静态文件都应位于 web 根文件夹 wwwroot 中。为了理解这一点,让我们创建一个简单的 Deflaut.html,包含以下内容。

现在,为了服务上述 Deflaut.html 静态文件,我们必须在 Startup 文件的 Configure() 方法中添加 StaticFiles 中间件,如下所示。

  1. public class Startup
  2. {
  3. public Startup()
  4. {
  5. }
  6. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  7. {
  8. app.UseStaticFiles();
  9. app.Run(async (context) =>
  10. {
  11. await context.Response.WriteAsync("Hello World");
  12. });
  13. }
  14. }

如上所述,app.UseStaticFiles() 方法将 StaticFiles 中间件添加到请求管道中。UseStaticFilesStaticFiles 中间件中包含的一种扩展方法,因此我们可以轻松配置它。

现在,打开浏览器并输入网址 http://localhost:<port>/default.html ,将显示 default.html 作为响应,如下所示。

这样,我们可以为存储在 wwwroot 文件夹或子文件夹中的任何其他文件提供服务。例如,考虑以下 test.js 文件。

现在,我们可以输入网址 http://localhost:<port>/test.js 来请求 js 文件。

假设您希望从 web 根文件夹(wwwroot)外部提供文件。例如,您在以下 images 文件夹中包含图像,如下所示。

现在,在 UseStaticFiles 方法中指定 StaticFileOptions 参数,以提供 images 文件夹中的图像,如下所示。

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. app.UseStaticFiles(); // For the wwwroot folder
  4. app.UseStaticFiles(new StaticFileOptions()
  5. {
  6. FileProvider = new PhysicalFileProvider(
  7. Path.Combine(Directory.GetCurrentDirectory(), @"Images")),
  8. RequestPath = new PathString("/app-images")
  9. });
  10. }

如您所见,我们使用 FileProvider 选项来指定将从中提供静态文件的 Images 文件夹。RequestPath 选项指定 URL 中映射到静态文件夹的相对路径。

现在输入网址 http://localhost/app-images/logo.png 就可以访问到 logo.png 文件了。


设置默认文件

如上所述,Default.htmltest.js 是根据特定的请求提供的。然而,如果我们希望在根请求上提供默认的 html 文件,该怎么办?

当前,当您输入网址 http://localhost:<port> ,它将由 run 方法处理并显示以下结果。

为了在输入 http://localhost:<port> 后显示 Default.html,在 Configure 方法中调用 UseStaticFiles() 之前调用 UseDefaultFiles() 方法,如下所示。

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. app.UseDefaultFiles();
  4. app.UseStaticFiles();
  5. app.Run(async (context) =>
  6. {
  7. await context.Response.WriteAsync("Hello World");
  8. });
  9. }

UseDefaultFiles 配置 DefaultFiles 中间件,它是 StaticFiles 中间件的一部分。它将自动为 http://localhost:<端口> 提供 default.html, default.htm, index.html 或 index.htm 文件。

注意:中间件的顺序非常重要。应用程序。应在应用程序之前添加 UseDefaultFiles()。在请求管道中使用 StaticFiles()

文件服务器

FileServer 中间件结合了 UseDefaultFilesUseStaticFiles 中间件的功能。因此,不要同时使用两个中间件,只需在 Configure 方法中使用 UseFileServer 即可。

UseFileServer = UseDefaultFiles + UseStaticFiles

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. app.UseFileServer();
  4. app.Run(async (context) =>
  5. {
  6. await context.Response.WriteAsync("Hello World");
  7. });
  8. }

因此,我们可以在 http 请求上提供静态文件。