写点什么

关于 ASP.NET Core 中的静态文件

作者:雄鹿 @
  • 2024-04-01
    广东
  • 本文字数:2668 字

    阅读完需:约 9 分钟

关于 ASP.NET Core 中的静态文件

本文章介绍在 ASP.NET Core 中的静态文件

默认情况下静态文件是 ASP.NET Core 应用直接提供给客户端的资源

先决条件

.NET SDK

介绍

静态文件存储在项目的 Web 根目录中。 默认目录为 {content root}/wwwroot,但可通过 UseWebRoot 方法更改目录

静态文件中间件

在 ASP.NET Core 中,要访问静态文件资源需要用 IApplicationBuilder.UseStaticFiles() 方法配置静态文件中间件,在静态文件中间件中由 PhysicalFileProvider 进行文件的管理

    Host.CreateDefaultBuilder()        .ConfigureWebHostDefaults(builder =>            builder.Configure(app =>                app.UseStaticFiles()            )        ).Build().Run();
复制代码


默认的无参情况下,URL 的基地址被映射到了 wwwroot 目录文件夹


还能显示定义 URL 和 磁盘目录文件夹的关系

    var path = Path.Combine(Directory.GetCurrentDirectory(), "content");    var options = new StaticFileOptions    {        FileProvider = new PhysicalFileProvider(path),        RequestPath = "/content"    };    Host.CreateDefaultBuilder()        .ConfigureWebHostDefaults(builder =>            builder.Configure(app =>                app.UseStaticFiles(options)            )        ).Build().Run();
复制代码


在上面这段代码中,将当前程序目录下的 content 目录与 http://localhost:*/content/ 进行映射

当然,配置多个静态文件中间件也是允许的


静态文件中间件中还可以显示指定 内容类型,就是 HTTP 的 content-type

我们可以指定凡事无法识别的文件,一律识别为某一种类型

    var options = new StaticFileOptions    {        ServeUnknownFileTypes = true,        DefaultContentType = "image/jpg"    };        Host.CreateDefaultBuilder()        .ConfigureWebHostDefaults(builder =>             builder.Configure(app =>                 app.UseStaticFiles(options)                    .UseDirectoryBrowser()            )        ).Build()    .Run();
复制代码


在上面代码中,将无法识别的文件响应的 content-type 一律指定为 image/jpg

还可以对指定类型的文件指定对应的 内容类型

    var contentTypeProvider = new FileExtensionContentTypeProvider();    contentTypeProvider.Mappings.Add(".abc", "image/jpg");    var options = new StaticFileOptions    {        ContentTypeProvider = contentTypeProvider    };
Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure(app => app.UseStaticFiles(options) .UseDirectoryBrowser() ) ).Build() .Run();
复制代码


在上面代码中,我们指定将尾缀名为 abc 文件的文件指定响应的 content-type 为 image/jpg,使浏览器拿到文件时,以 jpg 图片的格式来解析文件

目录浏览中间件

要浏览静态文件目录需要用 IApplicationBuilder.UseDirectoryBrowser() 方法配置目录浏览中间件

    Host.CreateDefaultBuilder()        .ConfigureWebHostDefaults(builder =>            builder.Configure(app =>            {                app.UseDirectoryBrowser()                    .UseStaticFiles();            })        ).Build()    .Run();
复制代码


一般需要用到 目录浏览中间件 时,都会用到 静态文件中间件

上面这例子中实现了对 wwwroot 的文件目录的浏览功能


也能够像静态文件中间件一样显示定义 URL 和 磁盘目录文件夹的关系

    var path = Path.Combine(Directory.GetCurrentDirectory(), "content");    var staticFileOptions = new StaticFileOptions    {        FileProvider = new PhysicalFileProvider(path),        RequestPath = "/content"    };    var directoryBrowserOptions = new DirectoryBrowserOptions    {        FileProvider = new PhysicalFileProvider(path),        RequestPath = "/content"    };    Host.CreateDefaultBuilder()        .ConfigureWebHostDefaults(builder => builder.Configure(            app => app                .UseStaticFiles()                .UseStaticFiles(staticFileOptions)                .UseDirectoryBrowser()                .UseDirectoryBrowser(directoryBrowserOptions)            )        ).Build()    .Run();
复制代码


在上面这段代码中,将当前程序目录下的 wwwroot 和 http://localhost:*/ 进行映射

content 目录与 http://localhost:*/content/ 进行映射

默认页面中间件

默认静态页面中间件使用 IApplicationBuilder.UseDefaultFiles() 方法配置

其中默认的默认页面有 "default.htm","default.html","index.htm","index.html" 一共四个

默认页面中间件一定需要和静态文件中间件一起使用,

因为默认页面中间件其实是对 url 的重写,具体响应还是静态文件中间件

默认页面中间件必须在静态文件中间件和目录浏览中间件之前,否则将无法发挥作用

    var path = Path.Combine(Directory.GetCurrentDirectory(), "content");    var fileProvider = new PhysicalFileProvider(path);    var staticFileOptions = new StaticFileOptions    {        FileProvider = fileProvider,        RequestPath = "/content"    };    var directoryBrowserOptions = new DirectoryBrowserOptions    {        FileProvider = fileProvider,        RequestPath = "/content"    };    var defaultFilesOptions = new DefaultFilesOptions    {        FileProvider = fileProvider,        RequestPath = "/content"    };    defaultFilesOptions.DefaultFileNames.Add("readme.html");    Host.CreateDefaultBuilder()        .ConfigureWebHostDefaults(builder =>             builder.Configure(app =>                 app.UseDefaultFiles()                    .UseDefaultFiles(defaultFilesOptions)                    .UseStaticFiles()                    .UseStaticFiles(staticFileOptions)                    .UseDirectoryBrowser()                    .UseDirectoryBrowser(directoryBrowserOptions)            )        ).Build()    .Run();
复制代码


上面这个示例中,还使用 DefaultFilesOptions.DefaultFileNames.Add("readme.html") 显示设置默认文件

发布于: 刚刚阅读数: 5
用户头像

雄鹿 @

关注

心像开满花的树。 2019-01-04 加入

一名全栈开发工程师,热爱编程、徒步、登山和摄影,对新技术充满好奇心,专注于使用ASP.NET Core和Angular进行Web应用的开发。

评论

发布
暂无评论
关于 ASP.NET Core 中的静态文件_ASP.NET Core_雄鹿 @_InfoQ写作社区