前言

今天我们来了解了解ASP.NET Core中的静态文件的处理方式.

以前我们寄宿在IIS中的时候,很多静态文件的过滤 和相关的安全措施 都已经帮我们处理好了.

ASP.NET Core则不同,因为是跨平台的,解耦了IIS,所以这些工作 我们可以在管道代码中处理.

正文

在我们的Web程序开发中,肯定要提供很多的静态文件(比如:JS,CSS)给客户端下载使用.所以我们先来看看ASP.NET Core中是怎么处理的.

当我们创建一个ASP.NET Core MVC的模版程序后,会发现它与传统的文件结构还是会有区别.

多了一个wwwroot文件夹,少了很多其他的资源文件夹.如图:

我们点进去,就可以看到,微软的模版,已经把所有的资源文件全放到了这里面,如图:

这样,项目就干净了许多,下面,我们就来讲讲这个资源根目录

1.提供静态文件

我们到模版的Startup管道配置中,可以看到,注入相关静态资源的代码,已经帮我们写好了,如图:

这句话就是注入静态资源用的,默认会将wwwroot的资源直接配置的和根目录一样,来方便访问.

访问资源的URL类似: "http://localhost:9189/images/banner3.svg" 这样.

那么问题来了,我们能不能自己配置这个静态资源呢?.

当然是可以的~.

我们在项目中创建文件夹如下:

然后通过StaticFileOptions注入静态资源的配置,代码如下:

app.UseStaticFiles(new StaticFileOptions()

{

FileProvider = new PhysicalFileProvider(

Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")),

RequestPath = new PathString("/StaticFiles")

});

注意:这里的2个StaticFiles, 第一个是你的本地资源路径,第二个是你需要配置的URL路径,URL路径可以自己定义,这样可以一定程度上保护自己的资源安全.

然后我们通过URL访问效果如下:

StaticFileOptions中,我们还可以通过OnPrepareResponse属性配置我们的响应头,添加 代码如下:

app.UseStaticFiles(new StaticFileOptions()

{

FileProvider = new PhysicalFileProvider(

Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")),

RequestPath = new PathString("/StaticFiles"),

OnPrepareResponse = ctx =>

{

ctx.Context.Response.Headers.Append("Cache-Control", "public,max-age=600");

}

});

这里,我们设置http响应缓存为600秒.

(小知识:max-age:表示当访问此网页后的max-age秒内再次访问不会去服务器请求,其功能与Expires类似,只是Expires是根据某个特定日期值做比较。一但缓存者自身的时间不准确.则结果可能就是错误的,而max-age,显然无此问题.。Max-age的优先级也是高于Expires的。)

效果如下:

这样,我们就可以根据需求来配置自己的静态文件缓存和其他的响应头信息.

2.启用静态文件目录浏览

开启静态文件目录浏览..其实是一件安全性级低的事情,不管是传统的asp.net还是asp.net core 默认都是关闭了这个功能.

但是,不排除我们会用到.在asp.net中,我们只需要的Web.config中配置即可.

下面我们就来讲讲如何在asp.net core 中启用我们的静态文件目录游览

开启静态文件目录游览需要使用UseDirectoryBrowser来注入配置,代码如下:

app.UseDirectoryBrowser(new DirectoryBrowserOptions()

{

FileProvider = new PhysicalFileProvider(

Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")),

RequestPath = new PathString("/MyStaticFiles")

});

这里,我特意改了URL的访问路径.为MyStaticFiles..我们来看看效果:

我们点击里面任意一个文件,会发现.返回404.因为路径是

所以,这里需要和上面的文件URL路径一致,才可以访问的到文件.(这样其实提供了一种比较安全的配置手段.可以隐藏自己本机的真实路径)

3.使用UseFileServer合成的注入方法~简化代码.

按照我们上面的配置,如果开启了文件和目录游览,就会发现写了不少注入代码,如下:

这样不是很方便,也不利于后期的维护.那么,下面我们就来简化他~

UseFileServer的功能结合了UseStaticFilesUseDefaultFilesUseDirectoryBrowser

我们把上面的代码全部注释.并修改代码如下:

app.UseFileServer(new FileServerOptions()

{

FileProvider = new PhysicalFileProvider(

Path.Combine(Directory.GetCurrentDirectory(), @"StaticFiles")),

RequestPath = new PathString("/StaticFiles"),

EnableDirectoryBrowsing = true

});

效果如下:

这里,注意EnableDirectoryBrowsing属性,就是是否启用目录的属性.

4.ASP.NET Core中使用MIME内容类型来过滤静态文件返回.

上篇文章我们提到过.需要使用

FileExtensionContentTypeProvider

这个类.具体使用方法,直接new一个即可,里面包含了300多种已知的文件类型,如下:

为什么这里我们要提到这个呢.因为他可以帮我们过滤一些不想让客户端访问的文件类型.如下:

这里要注意,使用FileExtensionContentTypeProvider,只能通过UseStaticFiles,不能使用UseFileServer

因为ContentTypeProvider是StaticFileOptions(静态文件选项)的配置内容,在FileServerOptions中并没有.

上面的代码,我们删除了png格式文件.也就是不返回这个内容的文件.运行后效果如下:

我们访问我们的gif格式的文件,效果如下:

还是可以正常访问的.对于一些安全性较高,或者涉及文件类型较多的功能来说.还是比较实用的.可以自己过滤掉一些敏感类型.比如exe.

原文地址: http://www.cnblogs.com/GuZhenYin/p/8205259.html


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

ASP.NET Core使用静态文件、目录游览与MIME类型管理相关推荐

  1. ASP.NET Core:静态文件

    在Web开发中,如js脚本.css样式.图片等的静态文件通常占据了很大一部分.ASP.NET Core提供了三个中间件来处理这种针对静态文件的请求.利用它们我们不经可以将物理文件发布为通过http请求 ...

  2. 利用ASP .NET Core的静态文件原理实现远程访问Nlog日志内容及解决遇到的坑

    最近项目上试运行发现,很多时候网站出了问题或者某个功能不正常,常常需要运维人员去服务器里面查看一下日志,看看日志里面会产生什么异常,这样导致每次都要去远程服务器很不方便,有时服务器是客户保管的不能让我 ...

  3. ASP.NET Core appsettings.json文件(9)《从零开始学ASP.NET CORE MVC》:

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:ASP.NET Core launchsettings.json文件 ASP.NET Core appsettings.j ...

  4. ASP.NET Core launchsettings.json文件(8)《从零开始学ASP.NET CORE MVC》:

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:ASP.NET Core 进程外(out-of-process)托管 ASP.NET Core launchsetting ...

  5. ASP.NET Core 导出Excel文件

    最近学了一个ASP.NET Core 导出Excel文件程序,在学习过程中遇到了不少的麻烦!为了让大家更明白的怎么用ASP.NET Core 导出Excel文件,我决定把我学到的东西分享出来! 首先我 ...

  6. ASP.NET Core 上传文件 图片上传

    在 ASP.NET Core 中上传文件 vs2019 选择文件后,调试停止问题 工具 -> 选项 -> 项目和解决方案 -> Web项目 -> 浏览器窗口关闭时停止调试器(s ...

  7. 从文件扩展名获取MIME类型

    本文翻译自:Get MIME type from filename extension 如何从文件扩展名中获取MIME类型? #1楼 参考:https://stackoom.com/question/ ...

  8. java7 javascript引擎_Java7中脚本引擎的一般用法,共三种方法获得JavaScript引擎:名称、文件扩展名、MIME类型 | 学步园...

    package com.sino.java7; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; i ...

  9. Asp.NET Core 轻松学-项目目录和文件作用介绍

    前言     上一章介绍了 Asp.Net Core 的前世今生,并创建了一个控制台项目编译并运行成功,本章的内容介绍 .NETCore 的各种常用命令.Asp.Net Core MVC 项目文件目录 ...

最新文章

  1. Android模拟器emulator-arm.exe出现错误
  2. 【原创】RabbitMQ 之 Access Control(翻译)
  3. leetcode 136. 只出现一次的数字 c语言
  4. 管理信息系统 课程设计(2018-6-16)
  5. MySQL(三)——函数、事务(ACID)、索引、权限管理和备份、数据库三大范式
  6. 无限试用CrossOver 15天的办法
  7. 踩内存是什么意思啊_面试|搬了这么久的砖,居然还不知道什么“踩内存”
  8. 关于寻路算法的一些思考(3):A*算法的实现
  9. linux下编译为知笔记,为知笔记 Linux 版安装
  10. java用户角色权限管理 只显示姓_快递物流管理系统SSM,JQUERYEASYUI,MYSQL
  11. BIGG Digital Assets宣布再次购买60.7枚比特币
  12. 01_传智播客iOS视频教程_课程介绍与知识点回顾
  13. vue 一个组件内多个弹窗_使用vue实现各类弹出框组件
  14. javap命令生成native需要的签名
  15. 关于Java的权限修饰符(public,private,protected,默认friendly)
  16. OpenFire 安装及配置
  17. MDM主数据管理平台开发精要
  18. 从电话网到IP互联网再到CDN
  19. 论文精读 清华ERNIE:Enhanced Language Representation with Informative Entities
  20. Gameplay - 设计使命召唤类型的关卡

热门文章

  1. 转载 雨松mono Unity获取游戏对象详解(来自我的长微博)
  2. Q+开放的互联网:腾讯QQ “亮剑” 开放平台
  3. CondenserDotNet - 使用 Kestrel 和 Consul 的 API 反向代理库!
  4. .NET6之MiniAPI(十二):引入EntityFramewor
  5. Win11重磅新功能推送!
  6. 自定义EventSource(二)PollingCounter
  7. 一日一技:在Ocelot网关中统一配置Swagger
  8. .NET:使用 LinqSharp 简化复杂查询
  9. 如何在 C# 中使用 const,readonly,static
  10. 甲骨文是否可以要求 Java API 享有版权?这场10年官司怎么结