静态文件(HTML,CSS,图片和Javascript之类的资源)会被ASP.NET Core应用直接提供给客户端。

  静态文件通常位于网站根目录(web root) <content-root>/wwwroot文件夹下。通常会把项目的当前目录设置为Content root,这样项目的web root就可以在开发阶段被明确。

  1. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  2. WebHost.CreateDefaultBuilder(args)
  3. .UseContentRoot(Directory.GetCurrentDirectory()) //设置当前目录
  4. .UseStartup<Startup>();

  静态文件能够被保存在网站根目录下的任意文件夹内,并通过相对根的路径来访问。使用vs创建一个默认的Web应用程序时,在wwwroot目录下会生成几个文件夹:css,images,js。如果压迫访问images目录下的图片:

    http://<app>/iamges/filename

    https://localhost:44303/iamges/filename

  

  要想使用静态文件服务,必须配置中间件,把静态文件中间件加入到管道。静态文件一般会默认配置,在Configure方法中调用app.UseStaticFiles()。

  app.UseStaticFiles() 使得web root(默认为wwwroot)下的文件可以被访问。同时可以通过UseStaticFiles方法将其他目录下的内容也可以向外提供:

    假如wwwroot外面有一个MyStaticFiles文件夹,要访问文件夹里面的资源test.png:  

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  2. {
  3.  
  4. app.UseHttpsRedirection();
  5. app.UseStaticFiles();
  6. app.UseStaticFiles(new StaticFileOptions() {
  7. FileProvider = new PhysicalFileProvider(
  8. Path.Combine(Directory.GetCurrentDirectory(), @"MyStaticFiles")), //用于定位资源的文件系统
  9. RequestPath = new PathString("/StaticFiles") //请求地址
  10. });
  11.  
  12. }

  可以通过访问

    http://<app>/StaticFiles/test.png

    https://localhost:44303/StaticFiles/test.png

1.静态文件授权

  静态文件组件默认不提供授权检查。任何通过静态文件中间件访问的文件都是公开的。要想给文件授权,可以将文件保存在wwwroot之外,并将目录设置为可被静态文件中间件能够访问,同时通过一个controller action来访问文件,在action中授权后返回FileResult

2.目录浏览

  目录浏览允许网站用户看到指定目录下的目录和文件列表。基于安全考虑,默认情况下是禁止目录访问功能。在Startup.Configure中调用UseDirectoryBrowser扩展方法可以开启网络应用目录浏览:

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  2. {
  3. app.UseStaticFiles();
  4.  
  5. app.UseDirectoryBrowser(new DirectoryBrowserOptions() {
  6. FileProvider = new PhysicalFileProvider(
  7. Path.Combine(Directory.GetCurrentDirectory(),@"wwwroot\images")),
  8. RequestPath = new PathString("/MyImages") //如果不指定RequestPath,会将PhysicalFileProvider中的路径参数作为默认文件夹,替换掉wwwroot
  1. }); }

  然后在Startup.CongigureServices中调用AddDirectoryBrowser扩展方法。

  这样就可以通过访问http://<app>/MyImages浏览wwwroot/images文件夹中的目录,但是不能访问文件:

  

  要想访问具体文件需要调用UseStaticFiles配置: 

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  2. {
  3. app.UseStaticFiles();
  4. app.UseStaticFiles(new StaticFileOptions() {
  5. FileProvider = new PhysicalFileProvider(
  6. Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\images")), //用于定位资源的文件系统
  7. RequestPath = new PathString("/MyImages")
  8. });
  9. app.UseDirectoryBrowser(new DirectoryBrowserOptions() {
  10. FileProvider = new PhysicalFileProvider(
  11. Path.Combine(Directory.GetCurrentDirectory(),@"wwwroot\images")),
  12. RequestPath = new PathString("/MyImages")
  13. });
  14.  
  15. }

3.默认文件

  设置默认首页能给站点的访问者提供一个起始页,在Startup.Configure中调用UseDefaFiles扩展方法:

  1. app.UseDefaultFiles(options);
  2. app.UseStaticFiles();

  UseDefaultFiles必须在UseStaticFiles之前调用。UseDefaultFiles只是重写了URL,而不是真的提供了一个这样的文件,浏览器URL将继续显示用户输入的URL。所以必须开启静态文件中间件。而且默认文件必须放在静态文件中间件可以访问得到的地方,默认是wwwroot中。

  通过UseDefaultFiles,请求文件夹的时候检索以下文件:

    default.htm

    default.html

    index.htm

    index.html

  也可以使用UseDefaultFiles将默认页面改为其他页面:

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. app.UseExceptionHandler("/Home/Error");
  10. app.UseHsts();
  11. }
  12.  
  13. app.UseHttpsRedirection();
  14. DefaultFilesOptions options = new DefaultFilesOptions();
  15. options.DefaultFileNames.Clear();
  16. options.DefaultFileNames.Add("mydefault.html");
  17. app.UseDefaultFiles(options);
  18. app.UseStaticFiles();
  19.  
  20. app.UseMvc(routes =>
  21. {
  22. routes.MapRoute(
  23. name: "default",
  24. template: "{controller=Home}/{action=Index}/{id?}");
  25. });
  26. }

4.UseFileServer

  UseFileServer集合了UseStaticFiles,UseDefaultFiles,UseDirectoryBrowser。

  调用app.UseFileServer(); 请用了静态文件和默认文件,但不允许直接访问目录。需要调用app.UseFileServer(enableDirectoryBrowsing:true); 才能启用目录浏览功能。

  如果想要访问wwwroot以外的文件,需要配置一个FileServerOptions对象 

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  2. {
           app.UseStaticFiles();//如果不调用,将不会启动默认功能。
  3. app.UseFileServer(new FileServerOptions()
  4. {
  5. FileProvider = new PhysicalFileProvider(
  6. Path.Combine(Directory.GetCurrentDirectory(), @"MyStaticFiles")),
  7. RequestPath = new PathString("/StaticFiles"),
  8. EnableDirectoryBrowsing = true
  9. });
  10. }

  注意,如果将enableDirectoryBrowsing设置为true,需要在ConfigureServices中调用services.AddDirectoryBrowser();

  如果默认文件夹下有默认页面,将显示默认页面,而不是目录列表。

5.FileExtensionContentTypeProvider

  FileExtensionContentTypeProvider类包含一个将文件扩展名映射到MIME内容类型的集合。

  例如:

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
  2. {
  3. var provider = new FileExtensionContentTypeProvider();
  4. provider.Mappings[".htm3"] = "text/html";
  5. provider.Mappings["images"] = "iamge/png";
  6. provider.Mappings.Remove(".mp4");
  7.  
  8. app.UseStaticFiles(new StaticFileOptions() {
  9. FileProvider = new PhysicalFileProvider(
  10. Path.Combine(Directory.GetCurrentDirectory(), @"MyStaticFiles")),
  11. RequestPath = new PathString("/StaticFiles"),
  12. ContentTypeProvider = provider
  13. });
  14. }

  更多MIME类型可以访问:http://www.iana.org/assignments/media-types/media-types.xhtml

6.非标准的内容类型

  如果用户请求了一个未知的文件类型,静态文件中间件将会返回HTTP 404响应。如果启用目录浏览,则该文件的链接将会被显示,但RUI会返回一个HTTP404错误。

  使用UseStaticFiles方法可以将未知类型作为指定类型处理:

  1. app.UseStaticFiles(new StaticFileOptions() {
  2. ServeUnknownFileTypes = true,
  3. DefaultContentType = "application/x-msdownload"
  4. });

  对于未识别的,默认为application/x-msdownload,浏览器将会下载这些文件。

    

ASP.NET Core 静态文件的更多相关文章

  1. ASP.NET Core 静态文件 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 静态文件 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 静态文件 前几章节中,我们学习了 ASP.NET Core 的中间件 ...

  2. ASP.NET Core静态文件中间件[1]: 搭建文件服务器

    虽然ASP.NET Core是一款"动态"的Web服务端框架,但是由它接收并处理的大部分是针对静态文件的请求,最常见的是开发Web站点使用的3种静态文件(JavaScript脚本. ...

  3. ASP.NET Core 静态文件及JS包管理器(npm, Bower)的使用

    在 ASP.NET Core 中添加静态文件 虽然ASP.NET主要大都做着后端的事情,但前端的一些静态文件也是很重要的.在ASP.NET Core中要启用静态文件,需要Microsoft.AspNe ...

  4. 细说ASP.NET Core静态文件的缓存方式

    一.前言 我们在优化Web服务的时候,对于静态的资源文件,通常都是通过客户端缓存.服务器缓存.CDN缓存,这三种方式来缓解客户端对于Web服务器的连接请求压力的. 本文指在这三个方面,在ASP.NET ...

  5. ASP.NET Core静态文件处理源码探究

    前言     静态文件(如 HTML.CSS.图像和 JavaScript)等是Web程序的重要组成部分.传统的ASP.NET项目一般都是部署在IIS上,IIS是一个功能非常强大的服务器平台,可以直接 ...

  6. asp .net core 静态文件资源

    前言 对静态资源的简单的一个概况,在<重新整理.net core 计1400篇>系列后面会深入. 正文 我们在加入中间件是这样写的: app.UseStaticFiles(); 默认是给w ...

  7. NET Core静态文件的缓存方式

    NET Core静态文件的缓存方式 阅读目录 一.前言 二.StaticFileMiddleware 三.ASP.NET Core与CDN? 四.写在最后 回到目录 一.前言 我们在优化Web服务的时 ...

  8. NET Core 静态文件及JS包管理器(npm, Bower)的使用

    NET Core 静态文件及JS包管理器(npm, Bower)的使用 文章目录 在 ASP.NET Core 中添加静态文件 使用npm管理JavaScript包 使用Bower管理JavaScri ...

  9. [转]NET Core静态文件的缓存方式

    本文转自:https://www.cnblogs.com/Leo_wl/p/6059349.html 阅读目录 NET Core静态文件的缓存方式 一.前言 二.StaticFileMiddlewar ...

随机推荐

  1. ARM开发板上查看动态库或者可执行程序的依赖关系

    以ARM32开发板为例,在/lib下有一个名为ld-linux-armhf.so.3的可执行程序(在ARM64开发板上是/lib/ld-linux-aarch64.so.1),这个程序负责加载可执行程 ...

  2. 为DS5添加新的gcc工具链

    环境: 步骤: 1.下载mingw32版本的工具链 下面有两个下载工具链的网站: ARM官网的: https://developer.arm.com/tools-and-software/open-s ...

  3. 洛谷P1192-台阶问题(线性递推 扩展斐波那契)

    占坑 先贴上AC代码 回头来补坑 #include <iostream> using namespace std; int n, k; const int mod = 100003; lo ...

  4. MacOS更改启动台(launchpad)图标大小

    原文链接:https://www.jianshu.com/p/18224d191bd2作者:麦壳君 小麦有点强迫症,觉得 Mac 启动台(Launchpad)里面系统默认的应用程序图标太大,所以想让它 ...

  5. LeetCode 568. Maximum Vacation Days

    原题链接在这里:https://leetcode.com/problems/maximum-vacation-days/ 题目: LeetCode wants to give one of its b ...

  6. IIS 报错 Cannot open database "test4" requested by the login. The login failed. Login failed for user 'IIS APPPOOL\test1'.

    报错: Cannot open database "test4" requested by the login. The login failed. Login failed fo ...

  7. [RN] React Native 图片保存到相册(支持 Android 和 ios)

    React Native 图片保存到相册(支持 Android 和 ios) 原理: IOS用 RN自带的 CameraRoll, Android 使用 不成功,需要 react-native-fs  ...

  8. 【luoguP2252】 取石子游戏

    题目链接 定义\(f[i][j]\)表示\(a=i,b=j\)时是必胜态还是必败态,博弈DP可以解决\(a,b \leq 100\) 的情况 然后就可以找规律了,发现\(f[i][j]=0\)的情况很 ...

  9. Linux下rpm及yum安装jdk

    笔者使用的Linux操作系统为CentOS7,Linux中有三种安装jdk的方式,在这里笔者主要介绍两种方式,即rpm和yum安装及卸载jdk,还有一种是直接从官网下载 tar.gz 压缩文件上传到L ...

  10. 一个sh脚本 同时运行 多个sh脚本

    问题: 原来的启动方式 cd /opt/OpenIMSCore ./pcscf.sh ./icscf.sh ./scscf.sh cd /opt/OpenIMSCore/FHoSS/deploy ./ ...