这个系列的初衷是便于自己总结与回顾,把笔记本上面的东西转移到这里,态度不由得谨慎许多,下面是我参考的资源:

ASP.NET Core 中文文档目录

官方文档

记在这里的东西我会不断的完善丰满,对于文章里面一些局限于我自己知识积累的观点,希望没有跳走坚持看完的朋友,能够予以指正和鼓励.

系列目录

(1)Starup

(2)中间件

(3)静态文件

静态文件

在上节中间件一节我们提到:静态文件中间件可以处理对静态文件的请求,并让管道的其余部分短路,从而起到终端中间件的作用

这一节我们对静态文件做一个更深入的了解. 以一个新建的.Net core Web项目(有视图模型控制器的模版)为例

提供静态文件

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

项目Program.cs内容如下, 采用WebHost.CreateDefaultBuilder方法可将内容根目录设置为当前目录:

     public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}

提供 Web 根目录内的文件

静态文件存储在项目的Web根目录中。 默认目录是 <content_root>/wwwroot,所以在项目wwwroot下面我们看到了如下结构

但是仅仅将内容根目录设置为当前目录还不行,我们还得在Starup启动类的Configure方法下添加静态文件中间件组件才行,

无参数的UseStaticFiles方法重载将Web根目录中的文件标记为可用
     public void Configure(IApplicationBuilder app)
{
3 app.UseStaticFiles();
}

这样wwwroot目录下的组员文件才能被访问,例如引用css文件

<link rel="stylesheet" href="~/css/site.css" />

假设我们把上述的UseStaticFiles方法注释掉,我们启动项目后就会发现页面的样式完全发生变化,那是因为在wwwroot里面的样式文件被禁止访问了

更改默认目录

上面说到静态文件默认的目录是 <content_root>/wwwroot,如果想换成别的命名,例如:<content_root>/staticroot,该如何操作呢?

我们可以通过WebHost.CreateDefaultBuilder方法,使用UseWebRoot更改默认目录,代码如下
 
     public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
//当前目录下的staticroot文件夹
.UseWebRoot(Path.Combine(Directory.GetCurrentDirectory(), "staticroot"))
.UseStartup<Startup>();
}

这样这样静态文件的默认目录由 <content_root>/wwwroot变为<content_root>/staticroot,如果不将项目的静态资源转移到<content_root>/staticroot下,那么项目中的静态资源将无法被访问

提供 Web 根目录外的文件

如果我们使用默认设置,那么静态文件的访问都是跳到了wwwroot下,这个时候问题就出现了,,假设有如下的目录结构

怎么设置能够使得同级目录也能够被访问,比如既能够访问<content_root>/wwwroot/img/header.jpg,又能够访问<content_root>/MyStaticFiles/images/header.jpg

这时候就需要有参数的UseStaticFiles方法,通过StaticFileOptions对象来解决

       public void Configure(IApplicationBuilder app)
{
// For the wwwroot folder
app.UseStaticFiles();
// For the /MyStaticFiles url
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")),
RequestPath = "/MyStaticFiles"
});
}

这样设置,2个同级目录就都可以访问了

设置 HTTP 响应标头

在静态文件中间件组件中,上述的StaticFileOptions 对象还可用于设置 HTTP 响应标头。

举例而言,以下代码除了配置从 Web 根目录提供静态文件外,还设置 Cache-Control 标头:

         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var cachePeriod = env.IsDevelopment() ? "" : "";
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}");
}
});
}
效果:在开发环境中可公开缓存这些文件 10 分钟(600 秒):

静态文件授权

静态文件模块并不提供授权检查。在上面设置wwwroot可以访问后,  wwwroot 下的所有文件都是公开的

所以为了给文件提供授权,你需要有如下的操作:

1将文件保存在 wwwroot 和静态文件中间件可以访问到的任何目录之外
    2通过一个控制器的 Action 来访问它们,通过授权后返回 FileResult

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

这样,只有通过了身份认证才能够得到文件信息

启用目录浏览

目录浏览允许网站用户看到指定目录下的目录和文件列表。

但是基于安全考虑,默认情况下是禁用目录访问功能的。

在 Startup.Configure 中调用 UseDirectoryBrowser 扩展方法可以开启网络应用目录浏览:

         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")),
RequestPath = "/Browser"
});
}

访问 <content_root>/Browser后效果如下

官方文档说明:还需要调用 Startup.ConfigureServices 中的AddDirectoryBrowser 方法,如下

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

但是我测试的时候没有注册这个服务,仍然可以启用目录,大家在用到或者测试的时候可用留意一下

默认文档服务

设置默认首页能给你的站点的每个访问者提供一个起始页。使站点能提供默认页,避免用户输入完整 URI.

输入以下代码

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

项目启动后,会在指定的目录(未设置则在wwwroot下)按如下顺序搜索文件,来作为网站的起始页

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

对于所用示例mvc项目来说,项目启动后,因为路由的原故,路径自动跳转到/home/index下,如果设置了提供默认文档,那么会按照下面的情况(一般而言静态文件中间件会放在前面,具体情况还是以中间件添加顺序为准)

路径 实际访问
http://localhost:xxx wwwroot下default.html
http://localhost:xxx/home home控制器index方法
http://localhost:xxx/home/Idex home控制器index方法
 
 
起始页默认是按上述的4个htm页面顺序来查找的,我们也可以更改为查找特定路径,代码如下
         public void Configure(IApplicationBuilder app)
{
// Serve my app-specific default file, if present.
DefaultFilesOptions options = new DefaultFilesOptions();
options.DefaultFileNames.Clear();
options.DefaultFileNames.Add("index.html");
app.UseDefaultFiles(options);
app.UseStaticFiles();
}

这样就变成了直接查找index.html,但是如果未找到index.html,那么会直接404找不到页面,而不会存在原来的查找顺序

UseFileServer

UseFileServer 结合了上述UseStaticFiles 、 UseDefaultFiles 和 UseDirectoryBrowser 的功能。 
以下代码启用静态文件、默认文件和及 MyStaticFiles 的目录浏览: 
 
         public void Configure(IApplicationBuilder app)
{
app.UseFileServer(new FileServerOptions
{
FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")),
RequestPath = "/MyStaticFIles",
EnableDirectoryBrowsing = true
});
}

访问<content_root>/MyStaticFIles/会有下面2种情况:

1/MyStaticFIles文件夹下没有default.htm,default.html,index.htm,index.html

2/MyStaticFIles文件夹下存在default.htm,default.html,index.htm,index.html一个或多个作为默认文档

非标准的内容类型

ASP.NET 静态文件中间件能够支持超过 400 种已知文件内容类型。

如果用户请求一个未知的文件类型,静态文件中间件将返回 HTTP 404(未找到)响应。

如果启用目录浏览,该文件的链接将会被显示,但 URI 会返回一个 HTTP 404 错误。

         public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles(new StaticFileOptions
{
ServeUnknownFileTypes = true,
DefaultContentType = "image/png"
});
}

根据上面的代码,未知内容类型的文件请求将返回一张图片,而不会返回一个未找到的错误。

Warnning

  • 代码文件(包括 C# 和 Razor)应该放在应用程序项目的 wwwroo(默认为wwwroot)之外的地方。这将确保您创建的应用程序能明确隔离客户端侧和服务器侧源代码,此举能防止服务器侧的代码被泄露。同时,不要在生产环境开启目录浏览

(终)

文档信息


感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接

Asp .Net core 2 学习笔记(3) —— 静态文件的更多相关文章

  1. ASP.NET Core 2 学习笔记(五)静态文件

    之前的ASP.NET网站,只要把*.html.*.css.*.jpg.*.png.*.js等静态文件放在项目根目录,默认都可以直接被浏览:但ASP.NET Core 小改了浏览静态文件的方式,默认根目 ...

  2. ASP.NET Core 2 学习笔记(十)视图

    ASP.NET Core MVC中的Views是负责网页显示,将数据一并渲染至UI包含HTML.CSS等.并能痛过Razor语法在*.cshtml中写渲染画面的程序逻辑.本篇将介绍ASP.NET Co ...

  3. Asp.Net Core WebApi学习笔记(四)-- Middleware

    Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...

  4. ASP.NET Core 2 学习笔记(七)路由

    ASP.NET Core通过路由(Routing)设定,将定义的URL规则找到相对应行为:当使用者Request的URL满足特定规则条件时,则自动对应到相符合的行为处理.从ASP.NET就已经存在的架 ...

  5. ASP.NET Core 2 学习笔记(十三)Swagger

    Swagger也算是行之有年的API文件生成器,只要在API上使用C#的<summary />文件注解标签,就可以产生精美的线上文件,并且对RESTful API有良好的支持.不仅支持生成 ...

  6. ASP.NET Core 2 学习笔记(十二)REST-Like API

    Restful几乎已算是API设计的标准,通过HTTP Method区分新增(Create).查询(Read).修改(Update)和删除(Delete),简称CRUD四种数据存取方式,简约又直接的风 ...

  7. sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)

    sql server 关于表中只增标识问题   由于我们系统时间用的过长,数据量大,设计是采用自增ID 我们插入数据的时候把ID也写进去,我们可以采用 关闭和开启自增标识 没有关闭的时候 ,提示一下错 ...

  8. ASP.NET Core 2 学习笔记(一)开始

    原文:ASP.NET Core 2 学习笔记(一)开始 来势汹汹的.NET Core似乎要取代.NET Framework,ASP.NET也随之发布.NET Core版本.虽然名称沿用ASP.NET, ...

  9. ASP.NET Core 2 学习笔记

    之前的ASP.NET网站,只要把*.html.*.css.*.jpg.*.png.*.js等静态文件放在项目根目录,默认都可以直接被浏览:但ASP.NET Core 小改了浏览静态文件的方式,默认根目 ...

随机推荐

  1. linux内socket服务器无法连接windows

    今天在试socket的时候出现了一个问题:问题概述是这样的: 1.linux采用centOS7(mini)版本,虚拟机版本VMware12,网卡设置NAT 2.服务器和客户端都在windows上,通讯 ...

  2. (转)用webbrowser做的网站登陆程序,如何获取cookie并且保存在程序中 (IE8有效) ,用途嘛,你懂的。

    今天帮朋友做了个工具,用webbrowser做的,用户使用用户名密码登陆网站后,需要在后台下载和分析一些页面. 分析页面使用的是htmlparser .net版 里面唯一需要解决的问题是,登陆后的co ...

  3. 关于进行pdf的每页广告去除、转换word等方案。

    pdf转word经常使用的是 软件下载安装破解完成以后进行编辑pdf,可以导出word,效果比一般的word自带的转换效果要好. 在进行pdf的每页去除页脚或者页眉的广告时候,使用pdf的替换功能.这 ...

  4. Mysql 数据库修改datadir和调整默认引擎要注意的问题

    数据库更改 datadir 默认位置: 首先前面的基础操作我就不多说了,无非是复制mysqldata目录,然后修改 my.conf 配置文件 datadir 的 路径地址.然后重启mysql.这里可能 ...

  5. 2018.12.21 bzoj3238: [Ahoi2013]差异(后缀自动机)

    传送门 后缀自动机好题. 题意: 做法:samsamsam 废话 考虑翻转字串,这样后缀的最长公共前缀等于前缀的最长公共后缀. 然后想到parentparentparent树上面两个串的最长公共后缀跟 ...

  6. 2018.11.08 NOIP模拟 水管(简单构造)

    传送门 仔细读题会发现只要所有点点权之和等于0一定有解. 如何构造? 直接当做树来构造就行了,非树边都赋值成0就行. 代码

  7. Query - noConflict() 方法

    ps:菜鸟教程 如何在页面上同时使用 jQuery 和其他框架? noConflict() 方法会释放对 $ 标识符的控制,这样其他脚本就可以使用它了. 当然,您仍然可以通过全名替代简写的方式来使用 ...

  8. hdu-1033(格式)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1033 参考文章:https://blog.csdn.net/curson_/article/detai ...

  9. jquery删除onclick属性和设置onclick属性--获取验证码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. RGB,YCBCR在HDMI传输线是数据排列

    RGB4:4:4 YCbCr4:4:4 YCbCr4:2:2 YCbCr4:2:0