ASP.NET Core 中的静态文件

1.前言

当我们创建Core项目的时候,Web根目录下会有个wwwroot文件目录,wwwroot文件目录里面默认有HTML、CSS、IMG、JavaScript等文件,而这些文件都是Core提供给客户端使用的静态文件。但是这些静态文件需要在Core里面配置才可以对外公开访问。

2.设置静态文件目录

静态文件都存储在Core Web根目录中。默认目录是<content_root>/wwwroot,但可通过 UseWebRoot方法更改访问目录。而content_root是指web项目的所有文件夹,包括bin和wwwroot文件夹。

2.1 设置默认静态文件目录

如果我们需要更改默认目录,该如何更改呢?让我们来看看如下示例,现在有wwwroot默认目录和新建MyStaticFiles目录:

640?wx_fmt=png640?wx_fmt=png

然后配置如下代码:

public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup
<Startup>()
.UseWebRoot(Directory.GetCurrentDirectory()
+ @"\MyStaticFiles\");//更改默认目录(wwwroot)路径方法,如果不需要更改,则注释这段代码。
}
//需要在Startup.Configure配置静态文件中间件。默认已配置,所以一般不用手动添加。
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
}
}

在Web主机在构建站点的时候,我们通过UseWebRoot方法把默认访问静态文件路径<content_root>/wwwroot更改为新建的<content_root>/MyStaticFiles文件路径,再通过Startup.Configure方法配置静态文件中间件让其公开可以访问。通过项目运行,我们可以在浏览器地址栏上看到如下表格响应结果:

根目录

URL上图片链接

更改默认目录前是否能打开图片链接

更改默认目录后是否能打开图片链接

<content_root>/wwwroot

https://localhost:5001/images/1.jpg

不能

<content_root>/MyStaticFiles

https://localhost:5001/images/2.jpg

不能

由上面表格结果,我们可以看到,未更改静态文件默认访问目录前,<content_root>/wwwroot目录下的静态文件(HTML、CSS、IMG、JavaScript等)是可以访问的,而<content_root>/MyStaticFiles下的静态文件是不可访问的。但是更改为<content_root>/MyStaticFiles目录访问路径后,<content_root>/wwwroot目录下的静态文件就访问不到了。下面我们在来看看如何配置访问Web根目录外的文件。

2.2 设置访问Web根目录外的文件

有时可能因为业务需求原因,为了区分默认静态文件,我们想要在Web根目录下新建一个静态文件夹处理业务。该如何配置呢?现在我们来了解下。
在2.1节点示例演示的时候,新建了一个MyStaticFiles目录,现在就拿这个目录来演示,请按如下方式配置静态文件中间件:

public void Configure(IApplicationBuilder app)
{
//设置默认静态文件
app.UseStaticFiles();
//设置自定义静态文件
app.UseStaticFiles(new StaticFileOptions
{
FileProvider
= new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(),
"MyStaticFiles")),
RequestPath
= "/StaticFiles" //重写了一个虚拟路径。
});
}

由上述代码可知,MyStaticFiles目录通过StaticFiles URI段公开。请求 http://<server_address>/StaticFiles/images/2.jpg提供 2.jpg 文件。也就是说在设置自定义静态文件中间件同时并不影响设置默认静态文件中间件。

3.设置HTTP响应标头

Core提供了StaticFileOptions对象可用于设置HTTP响应标头。除配置从Web根目录提供静态文件外,以下代码还设置Cache-Control标头,例如设置静态文件缓存时间:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var cachePeriod = env.IsDevelopment() ? "600" : "604800";
app.UseStaticFiles(
new StaticFileOptions
{
OnPrepareResponse
= ctx =>
{
// Requires the following import:
// using Microsoft.AspNetCore.Http;
ctx.Context.Response.Headers.Append("Cache-Control", $"public, max-age={cachePeriod}");//(秒)
}
});
}

代码中{cachePeriod}是设置浏览器缓存时间,这里我们设置为10分钟(600秒)缓存时间:

640?wx_fmt=png

通过浏览器辅助工具可以看到Response Headers设置了缓存时间。

4.静态文件授权

在之间第四章节,我们提到过,静态文件中间件一般在身份验证/授权中间件之前设置,所以静态文件不需要验证,但是比如我们需要Controller控制器授权提供文件信息,该如何设置?请看如下代码:

[Authorize]
public IActionResult BannerImage()
{
var file = Path.Combine(Directory.GetCurrentDirectory(),
"MyStaticFiles", "images", "banner1.svg");
return PhysicalFile(file, "image/svg+xml");
}

返回结果:

 640?wx_fmt=png

5.启用目录浏览

通过目录浏览,Web应用的用户可查看目录列表和指定目录中的文件。出于安全考虑,目录浏览默认处于禁用状态,启用目录浏览是有风险的。调用Startup.Configure中的UseDirectoryBrowser方法来启用目录浏览:

public void Configure(IApplicationBuilder app)
{
//第一个调用提供wwwroot文件夹中的静态文件。
   app.UseStaticFiles();
  
//第二个调用使用URL http://<server_address>/MyImages浏览wwwroot/images文件夹的目录。
app.UseStaticFiles(new StaticFileOptions
{
FileProvider
= new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(),
"wwwroot", "images")),
RequestPath
= "/MyImages"
});
app.UseDirectoryBrowser(
new DirectoryBrowserOptions
{
FileProvider
= new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(),
"wwwroot", "images")),
RequestPath
= "/MyImages"
});
}

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

public void ConfigureServices(IServiceCollection services)
{
services.AddDirectoryBrowser();
}

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

640?wx_fmt=png

6.设置静态文件默认文档

6.1设置默认文档

在Core设置默认主页为访问者访问网站时提供了起点,这种情况跟IIS上设置站点默认文档是一样的。若要在用户不完全限定URI的情况下提供默认页面,请调用Startup.Configure中的UseDefaultFiles方法:

public void Configure(IApplicationBuilder app)
{
//要提供默认文件,必须在UseStaticFiles前调用UseDefaultFiles。UseDefaultFiles实际上 //用于重写URL,不提供文件。通过UseStaticFiles启用静态文件中间件来提供文件。
app.UseDefaultFiles();
app.UseStaticFiles();
}

在wwwroot目录下新增一个default.html页面。这里要注意一点是,添加默认文档名称一样要跟IIS上默认文档名称(default.htm,default.html,index.htm,index.html)都一致,否则如果自定义名称,会默认打开路由默认路径地址。

640?wx_fmt=png

6.2更改默认文档名称

6.1小节提到一个点,添加默认文档都要跟IIS上默认名称一致,但是如果我们需要自定义默认文档名称呢?该如何设置?以下代码将默认文件名更改为mydefault.html:

public void Configure(IApplicationBuilder app)
{
// Serve my app-specific default file, if present.
DefaultFilesOptions options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add(
"mydefault.html");
app.UseDefaultFiles(options);
app.UseStaticFiles();
}

7.UseFileServer

Core提供了UseFileServer对象,这个对象集成了UseStaticFiles、UseDefaultFiles和 UseDirectoryBrowser的功能。下面我们通过代码来看看如何使用。
提供静态文件和默认文件。未启用目录浏览
app.UseFileServer();
通过启用目录浏览基于无参数重载进行构建
app.UseFileServer(enableDirectoryBrowsing: true);
启用静态文件、默认文件和及 MyStaticFiles 的目录浏览示例代码

public void ConfigureServices(IServiceCollection services)
{
services.AddDirectoryBrowser();
}
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
// For the wwwroot folder

app.UseFileServer(
new FileServerOptions
{
FileProvider
= new PhysicalFileProvider(
Path.Combine(Directory.GetCurrentDirectory(),
"MyStaticFiles")),
RequestPath
= "/StaticFiles",
EnableDirectoryBrowsing
= true
});
}

响应结果就不截图多说了,写那么久也累了。因为2-6小节也有示例,大家就自行测试吧。

参考文献:
ASP.NET Core 中的静态文件

原文地址:https://www.cnblogs.com/wzk153/p/10916567.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LOJ#2542. 「PKUWC2018」随机游走

LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求&#xff0c;考虑min−maxmin-maxmin−max容斥&#xff0c;转化为求第一次到达某一个点集的期望时间。 我们对于每一个点集sss&#xff0c;都求出fif_ifi​表示从iii结点到点集s…

基于Kebernetes 构建.NET Core技术中台

今天下午在腾讯云社区社区分享了《基于Kubernetes 构建.NET Core技术中台》&#xff0c;下面是演讲内容的文字实录。我们为什么需要中台我们现在处于企业信息化的新时代。为什么这样说呢&#xff1f;过去企业信息化的主流重心是企业内部信息化。但现在以及未来的企业信息化的主…

P3706 [SDOI2017]硬币游戏

P3706 [SDOI2017]硬币游戏 题目描述 Solution 前置技能&#xff1a; P4548 [CTSC2006]歌唱王国 歌唱王国就是n1n1n1的情况。 我们用类似的方法&#xff0c;先考虑两个串的情况。 设SAS_ASA​表示AAA串最先选到的概率&#xff0c;设SBS_BSB​表示BBB串最先选到的概率。 则…

RedLock 实现分布式锁

并发是程序开发中不可避免的问题&#xff0c;根据系统面向用户、功能场景的不同&#xff0c;并发的重视程度会有不同。从程序的角度来说&#xff0c;并发意味着相同的时间点执行了相同的代码&#xff0c;而有些情况是不被允许的&#xff0c;比如&#xff1a;转账、抢购占库存等…

AGC030D - Inversion Sum

AGC030D - Inversion Sum 题目描述 Solution 考虑dpdpdp&#xff0c;fi,jf_{i,j}fi,j​表示第iii个位置的数大于第jjj个位置的数的概率。 对于每一个询问修改贡献即可。 时间复杂度O(nqn2)O(nqn^2)O(nqn2)。 #include <vector> #include <list> #include <m…

[翻译] NumSharp的数组切片功能 [:]

原文地址&#xff1a;https://medium.com/scisharp/slicing-in-numsharp-e56c46826630翻译初稿&#xff08;英文水平有限&#xff0c;请多包涵&#xff09;&#xff1a;由于Numsharp新推出了数组切片这个牛逼的功能&#xff0c;所以.NET社区距离拥有强大的开源机器学习平台又近…

P3978 [TJOI2015]概率论

P3978 [TJOI2015]概率论 题目描述 Solution 设CnC_nCn​表示nnn个节点的树的个数&#xff08;卡特兰数&#xff09;&#xff0c;SnS_nSn​表示nnn个节点的所有树的叶子的个数和。 Cn∑i0n−1CiCn−i−1[n0]Sn2∑i0n−1SiCn−i−1[n1]C_n\sum_{i0}^{n-1} C_iC_{n-i-1}[n0]\\ …

Visual Studio 2019 16.1发布,更快更高效

Visual Studio 2019 16.1 已正式发布&#xff0c;可以看到&#xff0c;新版本的启动速度有了显著的提升&#xff0c;还节省了不少的内存空间。主要更新如下&#xff1a;IDE现已公开发布 Visual Studio IntelliCode&#xff0c;并且可以随任何支持 C#、C、TypeScipt/JavaScript …

牛顿迭代法

牛顿迭代法 定义 在一般意义下&#xff0c;牛顿迭代法可以求出一个函数的零点&#xff0c;而在多项式意义下&#xff0c;牛顿迭代能够求出&#xff1a;给定一个G(x)G(x)G(x)&#xff0c;求F(x)F(x)F(x)&#xff0c;使得G(F(x))≡0(modxn)G(F(x)) \equiv 0\;\;\;(mod\;\;x^n)G…

.NET Core 3.0之创建基于Consul的Configuration扩展组件

经过前面三篇关于.NET Core Configuration的文章之后&#xff0c;本篇文章主要讨论如何扩展一个Configuration组件出来。如果前面三篇文章没有看到&#xff0c;可以点击如下地址访问.NET Core 3.0之深入源码理解Configuration(一).NET Core 3.0之深入源码理解Configuration(二)…

Mono 和 .NET Core比翼双飞

大家好&#xff0c;今天给大家分享.NET 蓝图之下的Mono和.NET Core 话题&#xff0c;微软在Build 2019 大会上给.NET 做了一个五年规划&#xff0c;所以分享的主题就是《Mono和.NET Core 比翼双飞》&#xff0c;将在完成这个五年规划的时候合体。在开始这个主题之前&#xff0c…

在上司面前硬不起来?教你如何快速将字符串转换为可执行代码

老是因为活不好被上司欺凌&#xff1f;在上司面前很没面子&#xff1f;在上司面前硬不起来&#xff1f; 是时候分享一个可以快速将字符串转换为可执行代码的项目给你了 - YACEP !不过&#xff0c;这不是一篇专门对YACEP 做详细介绍的随笔&#xff0c;想知道更详细的的YACEP 细节…

P4827 [国家集训队] Crash 的文明世界

P4827 [国家集训队] Crash 的文明世界 题目描述 Solution 看到这种kkk次幂的式子&#xff0c;就应该往斯特林数的方面想想。 mn∑i{ni}(ni)i!m^n\sum_i \left\{ \begin{aligned} n \\ i \end{aligned} \right\} \left ( \begin{aligned} n \\ i \end{aligned} \right )i!mn∑…

ConcurrentDictionary线程不安全么,你难道没疑惑,你难道弄懂了么?

事情不太多时&#xff0c;会时不时去看项目中同事写的代码可以作个参考或者学习&#xff0c;个人觉得只有这样才能走的更远&#xff0c;抱着一副老子天下第一的态度最终只能是井底之蛙。前两篇写到关于断点传续的文章&#xff0c;还有一篇还未写出&#xff0c;后续会补上&#…

bzoj#4555. [Tjoi2016Heoi2016]求和

bzoj#4555. [Tjoi2016&Heoi2016]求和 题目描述 Solution 有一个关于第二类斯特林数的公式&#xff1a; {nm}1m!∑i(mk)(m−k)n(−1)k\left\{ \begin{aligned} n \\ m \end{aligned} \right\} \frac{1}{m!}\sum_i \left ( \begin{aligned} m \\ k \end{aligned} \right )…

记一次ORM的权衡和取舍

面对ORM的选型&#xff0c;有些人是根据自己熟悉程度来评判&#xff0c;有些人是根据他人的推荐来抉择&#xff0c;有些人觉得都差不多&#xff0c;随便了。当自己要真正做选择的时候&#xff0c;以上的这些依据都无法真正说服自己&#xff0c;因为不同的业务需求&#xff0c;不…

P5395 【模板】第二类斯特林数·行

P5395 【模板】第二类斯特林数行 题目描述 Solution 这题是[Tjoi2016&Heoi2016]求和的前置技能啊…… 我似乎直接跳过这题&#xff0c;去做应用了QAQQAQQAQ。 Code #include <vector> #include <list> #include <map> #include <set> #inclu…

出让执行权:Task.Yield, Dispatcher.Yield

一个耗时的任务&#xff0c;可以通过 Task.Yield 或者 Dispatcher.Yield 来中断以便分割成多个小的任务片段执行。Yield 这个词很有意思&#xff0c;叫做“屈服”“放弃”“让步”&#xff0c;字面意义上是让出当前任务的执行权&#xff0c;转而让其他任务可以插入执行。Task、…

HDU4372 Count the Buildings

HDU4372 Count the Buildings 题目描述 Solution 思路很妙。 考虑从最高的一个楼房将序列分开&#xff0c;左边可以看到FFF个&#xff0c;右边可以看到BBB个&#xff0c;一个楼房可以被看到&#xff0c;则一定是其之前没有比它高的楼房&#xff0c;其之后有若干个比它矮的楼…

VS Code 即将迎来再一次的 logo 更新!已可在 Insiders 版本尝鲜

为什么要说“再一次”&#xff1f; 相信 VS Code 的老用户都还记得两年前的 logo 更新风波吧。当时 VS Code 改了新 logo 之后&#xff0c;VS Code 的用户们一片哀嚎&#xff0c;纷纷觉得新 logo 太丑&#xff0c;在 GitHub 和各种社交媒体上各种吐槽&#xff01;不过幸运的是&…