ASP.NET Core 中的静态文件Static files in ASP.NET Core

静态文件(如 HTML、CSS、图像和 JavaScript)是 ASP.NET Core 应用直接提供给客户端的资产。需要进行一些配置才能提供这些文件。

如何下载

静态文件存储在项目的 目录中。默认目录是 {content root}/wwwroot,但可通过 UseWebRoot 方法更改目录 。有关详细信息,请参阅和 Web 根目录

应用的 Web 主机必须识别内容根目录。

采用 方法可将内容根目录设置为当前目录:

调用 Program.Main 中的 将内容根目录设为当前目录:

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. var host = new WebHostBuilder()
  6. .UseKestrel()
  7. .UseContentRoot(Directory.GetCurrentDirectory())
  8. .UseIISIntegration()
  9. .UseStartup<Startup>()
  10. .UseApplicationInsights()
  11. .Build();
  12. host.Run();
  13. }
  14. }

可通过 Web 根目录的相关路径访问静态文件。例如,Web 应用程序项目模板包含 wwwroot 文件夹中的多个文件夹 :

  • wwwroot
    • css
    • images
    • js

用于访问 images 子文件夹中的文件的 URI 格式为 ; 。例如, http://localhost:9189/images/banner3.svg

如果以 .NET Framework 为目标,请将 包添加到项目。如果以 .NET Core 为目标,Microsoft.AspNetCore.App 元包将包括此包。

如果以 .NET Framework 为目标,请将 包添加到项目。如果以 .NET Core 为目标,请将 Microsoft.AspNetCore.All 元包加入此包。

将 包添加到项目。

配置提供静态文件的中间件

调用 Startup.Configure 中的 方法:

  1. public void Configure(IApplicationBuilder app)
  2. {
  3. app.UseStaticFiles();
  4. }

无参数 UseStaticFiles 方法重载将 Web 根目录中的文件标记为可用。以下标记引用 wwwroot/images/banner1.svg :

  1. <img src="~/images/banner1.svg" alt="ASP.NET" class="img-responsive" />

在上面的代码中,波形符 ~/ 指向 。

考虑一个目录层次结构,其中要提供的静态文件位于 Web 根目录之外:

  • wwwroot
    • css
    • images
    • js
  • MyStaticFiles
    • images
      • banner1.svg

按如下方式配置静态文件中间件后,请求可访问 banner1.svg 文件 :

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

在前面的代码中,MyStaticFiles 目录层次结构通过 StaticFiles URI 段公开 。请求 提供 banner1.svg 文件 。

以下标记引用 MyStaticFiles/images/banner1.svg :

  1. <img src="~/StaticFiles/images/banner1.svg" alt="ASP.NET" class="img-responsive" />

StaticFileOptions 对象可用于设置 HTTP 响应标头。除配置从 提供静态文件外,以下代码还设置 Cache-Control 标头:

若要查看翻译为非英语语言的代码注释,请在 此 GitHub 讨论问题中告诉我们。

在开发环境中可公开缓存这些文件 10 分钟(600 秒):

静态文件授权Static file authorization

静态文件中间件不提供授权检查。可公开访问由静态文件中间件提供的任何文件,包括 wwwroot 下的文件。根据授权提供文件:

  • 将文件存储在 wwwroot 和静态文件中间件可访问的任何目录之外 。

  • 通过有授权的操作方法提供文件。返回 FileResult 对象:

  1. public IActionResult BannerImage()
  2. {
  3. var file = Path.Combine(Directory.GetCurrentDirectory(),
  4. "MyStaticFiles", "images", "banner1.svg");
  5. return PhysicalFile(file, "image/svg+xml");
  6. }

启用目录浏览Enable directory browsing

通过目录浏览,Web 应用的用户可查看目录列表和指定目录中的文件。出于安全考虑,目录浏览默认处于禁用状态(请参阅注意事项)。调用 Startup.Configure 中的 方法来启用目录浏览:

  1. public void Configure(IApplicationBuilder app)
  2. {
  3. app.UseStaticFiles(); // For the wwwroot folder
  4. app.UseStaticFiles(new StaticFileOptions
  5. {
  6. FileProvider = new PhysicalFileProvider(
  7. Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
  8. });
  9. app.UseDirectoryBrowser(new DirectoryBrowserOptions
  10. {
  11. FileProvider = new PhysicalFileProvider(
  12. Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
  13. RequestPath = "/MyImages"
  14. });
  15. }

调用 Startup.ConfigureServices 中的AddDirectoryBrowser 方法来添加所需服务:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddDirectoryBrowser();
  4. }

上述代码允许使用 URL 浏览 wwwroot/images 文件夹的目录,并链接到每个文件和文件夹 :

目录浏览

有关启用浏览时的安全风险,请参阅注意事项

请注意以下示例中的两个 UseStaticFiles 调用。第一个调用提供 wwwroot 文件夹中的静态文件 。第二个调用使用 URL 浏览 wwwroot/images 文件夹的目录 :

  1. public void Configure(IApplicationBuilder app)
  2. {
  3. app.UseStaticFiles(); // For the wwwroot folder
  4. app.UseStaticFiles(new StaticFileOptions
  5. {
  6. FileProvider = new PhysicalFileProvider(
  7. Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
  8. RequestPath = "/MyImages"
  9. });
  10. app.UseDirectoryBrowser(new DirectoryBrowserOptions
  11. {
  12. FileProvider = new PhysicalFileProvider(
  13. Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
  14. RequestPath = "/MyImages"
  15. });
  16. }

设置默认主页为访问者访问网站时提供了逻辑起点。若要在用户不完全限定 URI 的情况下提供默认页面,请调用 Startup.Configure 中的 UseDefaultFiles 方法:

  1. public void Configure(IApplicationBuilder app)
  2. {
  3. app.UseDefaultFiles();
  4. app.UseStaticFiles();
  5. }

重要

要提供默认文件,必须在 UseStaticFiles 前调用 UseDefaultFilesUseDefaultFiles 实际上用于重写 URL,不提供文件。通过 UseStaticFiles 启用静态文件中间件来提供文件。

使用 UseDefaultFiles 请求文件夹搜索:

  • default.htm
  • default.html
  • index.htm
  • index.html

将请求视为完全限定 URI,提供在列表中找到的第一个文件。浏览器 URL 继续反映请求的 URI。

以下代码将默认文件名更改为 mydefault.html :

UseFileServerUseFileServer

UseFileServer 结合了 UseStaticFilesUseDefaultFilesUseDirectoryBrowser(可选)的功能。

以下代码提供静态文件和默认文件。未启用目录浏览。

  1. app.UseFileServer();

以下代码通过启用目录浏览基于无参数重载进行构建:

  1. app.UseFileServer(enableDirectoryBrowsing: true);

考虑以下目录层次结构:

  • wwwroot
    • images
    • js
  • MyStaticFiles
    • images
      • banner1.svg
    • default.html
  1. public void Configure(IApplicationBuilder app)
  2. {
  3. app.UseStaticFiles(); // For the wwwroot folder
  4. {
  5. FileProvider = new PhysicalFileProvider(
  6. Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")),
  7. RequestPath = "/StaticFiles",
  8. EnableDirectoryBrowsing = true
  9. });
  10. }

EnableDirectoryBrowsing 属性值为 true 时必须调用 AddDirectoryBrowser

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddDirectoryBrowser();
  4. }

使用文件层次结构和前面的代码,URL 解析如下:

如果 MyStaticFiles 目录中不存在默认命名文件,则 返回包含可单击链接的目录列表 :

备注

UseDefaultFiles 和 执行从 http://{SERVER ADDRESS}/StaticFiles(不带尾部斜杠)到 ADDRESS}/StaticFiles/(带尾部斜杠)的客户端重定向。如果没有尾部斜杠,StaticFiles 目录中的相对 URL 无效。

FileExtensionContentTypeProviderFileExtensionContentTypeProvider

类包含 Mappings 属性,用作文件扩展名到 MIME 内容类型的映射。在以下示例中,多个文件扩展名注册到了已知的 MIME 类型。替换了 .rtf 扩展名,删除了 .mp4 。

  1. public void Configure(IApplicationBuilder app)
  2. {
  3. // Set up custom content types - associating file extension to MIME type
  4. var provider = new FileExtensionContentTypeProvider();
  5. // Add new mappings
  6. provider.Mappings[".myapp"] = "application/x-msdownload";
  7. provider.Mappings[".htm3"] = "text/html";
  8. provider.Mappings[".image"] = "image/png";
  9. // Replace an existing mapping
  10. provider.Mappings[".rtf"] = "application/x-msdownload";
  11. // Remove MP4 videos.
  12. provider.Mappings.Remove(".mp4");
  13. app.UseStaticFiles(new StaticFileOptions
  14. {
  15. FileProvider = new PhysicalFileProvider(
  16. Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
  17. RequestPath = "/MyImages",
  18. ContentTypeProvider = provider
  19. });
  20. app.UseDirectoryBrowser(new DirectoryBrowserOptions
  21. {
  22. FileProvider = new PhysicalFileProvider(
  23. Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
  24. RequestPath = "/MyImages"
  25. });
  26. }

请参阅 MIME 内容类型

静态文件中间件可理解近 400 种已知文件内容类型。如果用户请求文件类型未知的文件,则静态文件中间件将请求传递给管道中的下一个中间件。如果没有中间件处理请求,则返回“404 未找到” 响应。如果启用了目录浏览,则在目录列表中会显示该文件的链接。

以下代码提供未知类型,并以图像形式呈现未知文件:

使用前面的代码,请求的文件含未知内容类型时,以图像形式返回请求。

警告

启用 存在安全风险。它默认处于禁用状态,不建议使用。FileExtensionContentTypeProvider 提供了更安全的替代方法来提供含非标准扩展名的文件。

从多个位置提供文件Serve files from multiple locations

UseStaticFilesUseFileServer 默认为指向 wwwroot 的文件提供程序 。可使用其他文件提供程序提供 UseStaticFilesUseFileServer 的其他实例,从多个位置提供文件。有关详细信息,请参阅此 GitHub 问题

警告

UseDirectoryBrowserUseStaticFiles 可能会泄漏机密。强烈建议在生产中禁用目录浏览。请仔细查看 UseStaticFilesUseDirectoryBrowser 启用了哪些目录。整个目录及其子目录均可公开访问。将适合公开的文件存储在专用目录中,如 <content_root>/wwwroot 。将这些文件与 MVC 视图、Razor 页面(仅限 2.x)和配置文件等分开

  • 使用 UseDirectoryBrowser 和 公开的内容的 URL 受大小写和基础文件系统字符限制的影响。例如,Windows 不区分大小写 — macOS 和 Linux 却要区分。

  • 托管于 IIS 中的 ASP.NET Core 应用使用 将所有请求转发到应用,包括静态文件请求。未使用 IIS 静态文件处理程序。在模块处理请求前,处理程序没有机会处理请求。

  • 在 IIS Manager 中完成以下步骤,删除服务器或网站级别的 IIS 静态文件处理程序:

    • 转到“模块”功能 。
    • 在列表中选择 StaticFileModule 。
    • 单击“操作”侧栏中的“删除” 。

警告

如果启用了 IIS 静态文件处理程序且 ASP.NET Core 模块配置不正确,则会提供静态文件 。例如,如果未部署 web.config 文件,则会发生这种情况 。

  • 将代码文件(包括 .cs 和 .cshtml )放在应用项目的 Web 根目录之外 。这样就在应用的客户端内容和基于服务器的代码间创建了逻辑分隔。可以防止服务器端代码泄漏。

其他资源Additional resources