《ASP.NET Core 高性能系列》静态文件中间件
一、概述
静态文件(如 HTML、CSS、图片和 JavaScript等文件)是 Web程序直接提供给客户端的直接加载的文件。 较比于程序动态交互的代码而言,其实原理都一样(走Http协议),
ASP.NET Core中需要进行一些配置才能提供这些文件。
二、wwwroot
静态文件存储在项目的 Web 程序的 {ContentRoot}/wwwroot目录下,但可通过 UseWebRoot 方法更改路径 。
Web 应用程序项目的 wwwroot 文件夹中默认有多个文件夹 :
- wwwroot
- css
- images
- js
用于访问 images 子文件夹中的文件的 URI 格式为 http://<server_address>/images/<image_file_name> 。 例如, http://localhost:1189/images/banner.png。
通过以下代码开启静态文件访问功能(设置 {ContentRoot}/wwwroot为默认的静态文件工作目录)
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
}
三、设置指定目录为静态文件工作目录
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles(); // wwwroot 目录 app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "the_path_to_yours")),
RequestPath = "/GiveAName"
});
}
注意访问自定义的静态文件路径发生变化:http://localhost:1189/GiveAName/images/banner.png
四、给静态文件添加客户端缓存
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var cachePeriod = env.Production() ? "" : "";
app.UseStaticFiles(new StaticFileOptions
{
OnPrepareResponse = ctx =>
{
// 记得下面的引用:
// using Microsoft.AspNetCore.Http;
ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cachePeriod}");
}
});
}
如上,在生产环境中,我们给静态文件添加了60000(ms)的缓存,即:在一分钟内,客户端都会从浏览器本地拿文件,注意此手法,直接更新静态文件一时间是拿不到最新文件的.

五、利用PhysicalFile方法让静态文件的访问可以进行鉴权
静态文件中间件允许浏览器端访问由静态文件中间件提供的所有静态文件(包括 wwwroot 下的文件),我们设想实际的一个应用场景,我们上传了一个文件到指定目录,而这个文件只能当事人自己可以进行访问,那么如何进行权限验证呢?
[Authorize]//身份验证
public IActionResult UsersOwnPictrue()
{
var file = Path.Combine(Directory.GetCurrentDirectory(),
"StaticFilesPath", "images", "my.svg");
return PhysicalFile(file, "image/svg+xml");//返回静态文件
}
六、前后端分离开发中的使用
前后端开发分离的开发模式中,前端自己负责前端的一切交互工作,不仅如此还会在后端工作没有启动前自己构造数据,ASP.NET Core静态文件中间件,正好可和此开发
模式进行衔接,此处省略一万字,有一点大家比较关心的问题:如何设置项目起始页,如何设置前端项目中的默认页
public void Configure(IApplicationBuilder app)
{
app.UseDefaultFiles();//必须在UseStaticFiles前调用UseDefaultFiles。UseDefaultFiles实际上用于重写 URL,不提供文件。
app.UseStaticFiles(); //这两步
}
使用 UseDefaultFiles 会使用以下这些文件作为整个项目的默认起始页:
default.htm
default.html
index.htm
index.html
public void Configure(IApplicationBuilder app)
{
// 使用其他文件作为默认静态页面文件
DefaultFilesOptions options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add("其他wwwroot下的.html");
app.UseDefaultFiles(options);
app.UseStaticFiles();
}
app.UseFileServer();//可将上面两步何为一步
七、关于UseFileServer
UseFileServer 整合了 UseStaticFiles、UseDefaultFiles 和 UseDirectoryBrowser(可选,如果启用需要services.AddDirectoryBrowser())的功能,
public void Configure(IApplicationBuilder app)
{ app.UseFileServer(new FileServerOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "文件夹")),
RequestPath = "/请求名",
EnableDirectoryBrowsing = true
});
}
| 请求连接 | 对应路径 |
| http://<server_address>/请求名/images/file1.png | 文件夹/images/file1.png |
| http://<server_address>/请求名/ | 文件夹/default.html |
八、开启目录浏览功能
此功能通常不要开启,因为比较危险,通过目录浏览,Web 应用的用户可查看目录列表和指定目录中的文件。 出于安全考虑,调用 Startup.Configure 中的 UseDirectoryBrowser 方法来启用目录浏览:
public void ConfigureServices(IServiceCollection services)
{
services.AddDirectoryBrowser();
}
app.UseDirectoryBrowser(new DirectoryBrowserOptions //开启对wwwroot/images的文件进行浏览的功能
{
FileProvider = new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "images")),
RequestPath = "/MyImages"
});
九、指定指定文件类型的MIME类型
public void Configure(IApplicationBuilder app)
{ var provider = new FileExtensionContentTypeProvider(); provider.Mappings[".rtf"] = "application/x-msdownload";
// 移除指定文件的解析
provider.Mappings.Remove(".mp4");
......
}
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles(new StaticFileOptions
{
//未知类型的ContentType
ServeUnknownFileTypes = true,
DefaultContentType = "bala/your type"
});
}
《ASP.NET Core 高性能系列》静态文件中间件的更多相关文章
- ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面
DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会 ...
- ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构
和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义了一个请求地址与某个物理目录之间的映射关系,而目标目录体现为一个FilePr ...
- ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求
我们通过<以Web的形式发布静态文件>和<条件请求与区间请求>中的实例演示,以及上面针对条件请求和区间请求的介绍,从提供的功能和特性的角度对这个名为StaticFileMidd ...
- ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介
概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware ...
- ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件
虽然ASP.NET Core是一款"动态"的Web服务端框架,但是在很多情况下都需要处理针对静态文件的请求,最为常见的就是这对JavaScript脚本文件.CSS样式文件和图片文件 ...
- ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...
- (5)ASP.NET Core 中的静态文件
1.前言 当我们创建Core项目的时候,Web根目录下会有个wwwroot文件目录,wwwroot文件目录里面默认有HTML.CSS.IMG.JavaScript等文件,而这些文件都是Core提供给客 ...
- Asp.Net Core 中的静态文件
Asp.Net Core 中的静态文件 在这节中我们将讨论如何使 ASP.NET Core 应用程序,支持静态文件,如 HTML,图像,CSS 和 JavaScript 文件. 静态文件 默认情况下, ...
- 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!
写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...
随机推荐
- k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
非常非常抱歉,新年上班第一天, 在今天阿里云上气候突变情况下,由于我们开船技术差,在今天 10:15~12:00 左右的访问高峰,我们竟然把船给开翻了,造成近2个小时整个博客站点无法访问,由此给您带来 ...
- 轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
背景介绍 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数 ...
- Windows远程桌面管理--功能强大的远程批量管理工具【转】
曾经,我想着要是有一款绿色小巧,功能实用的远程桌面管理工具,其界面简洁,操作便捷,能够同时远程操作多台服务器,并且多台服务器间可以自由切换,适用于网站管理人员使用的工具该有多好,苍天不负有心人,终于出 ...
- JVM探秘:Java对象
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 对象的创建 虚拟机遇到一条 new 指令时,首先去检查这个指令的参数是否能在方法区常量 ...
- 我终于懂得如何使用matplotlib进行画图
一 前言 本篇文章带大家快速入门如何使用matplotlib画出精美数学的图片:看完本篇文章你将获得熟悉并简单使用matplotlib工具,会画基本得折现图,散点图,sin,cos图,一张画布画出多图 ...
- 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵
佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...
- 在Git的PR(Pull Request)提示冲突无法merge合并的解决方案
问题 假设有一个分支A,向master分支提交PR,然后发生无法自动解决的冲突,PR提示不能执行merge合并. 解决方案1 本地checkout检出并切换到A分支,pull拉取更新到最新代码 在本地 ...
- 利用SSH桥接访问服务器的Docker运行的MySql服务
前情提要 docker的运用越来广泛,许多IT公司都已经将自己的服务跑在Docker上面.在安全性方面又做了一层防护.比如:跑在Docker上的Mysql不做外网端口映射,只能在linux服务器上或进 ...
- oracle-按年、月、周、日、时、分 分组查询统计数据,无数据补零(connect by)
目的:统计一段时间内每年.每月.每周.每日.每时.每分数据,无数据时自动补零 思路:1. 生成给定时间段对应日期 2. 将原表中该时间段内的不为0的数据量统计出来 3. 用left join连接起来, ...
- Project Settings之Quality翻译
(版本是2018.4......翻译是自己的渣翻译水平) Unity allows you to set the level of graphical quality it attempts to r ...