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

原文:ASP.NET Core使用静态文件、目录游览与MIME类型管理

前言

今天我们来了解了解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.

写在最后

好了,本篇到此就结束了~欢迎大家批评指正~喜欢或者觉得有用的话 就关注一下 点个推荐..谢谢~

原文地址:https://www.cnblogs.com/lonelyxmas/p/10950602.html

时间: 2024-10-06 19:14:51

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

asp.net core 之静态文件目录的操作

文章前言 之前写了一篇关于模拟登录的文章,自我感觉内容不太丰富,今天的这篇文章,希望在内容上能丰富些.本人缺少写文章的经验,技术上也是新手,但我会努力的,希望大家多多支持小弟. asp.net core项目静态文件 创建一个asp.net core 项目的静态文件一般是放在项目目录下wwwroot文件夹,文件目录如下. 如何将静态文件注入到项目中 在startup.cs文件的Configure方法中写入: app.UseStaticFiles(); 这方法的默认路径正是上面所说的wwwroot目

ASP.NET Core缓存静态资源

原文:ASP.NET Core缓存静态资源 背景 缓存样式表,JavaScript或图像文件等静态资源可以提高您网站的性能.在客户端,总是从缓存中加载一个静态文件,这样可以减少对服务器的请求数量,从而减少获取页面及其资源的时间.在服务器端,由于它们的请求较少,服务器可以处理更多的客户端而无需升级硬件. 虽然缓存是一件好事,但您必须确保客户端始终运行最新版本的应用程序.当您部署下一个版本的网站时,您不希望客户端使用过时的缓存版本的文件. 方案: 为确保用户始终使用最新版本的文件,我们必须为每个文件

ASP.NET Core appsettings.json 文件

ASP.NET Core appsettings.json 文件 在本节中,我们将讨论 ASP.NET Core 项目中appsettings.json文件的重要性. 在以前的 ASP.NET 版本中,我们将应用程序配置设置(例如数据库连接字符串)存储在web.config文件中. 在 Asp.Net Core 中, 应用程序配置设置可以来自以下不同的配置源. 文件(appsettings.json, appsettings..json) Environment环境不同,托管在对应环境. Use

ASP.NET Core在Azure Kubernetes Service中的部署和管理

目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cli 安装 Docker 进入正题 资源组 创建资源组 删除资源组 容器注册表 Azure Container Register (ACR) 创建 ACR 登录 ACR 服务主体 service principle 创建服务主体 给服务主体配置 ACR 的pull权限 K8s服务集群 Azure Ku

asp.net core中DockerFile文件中的COPY

今天在ubuntu系统中使用docker部署asp.net core时遇到了一个问题,docker build 的时候总会在最后一步提示 lstat obj/Docker/publish: no such file or directory. 并且执行docker images查看镜像的时候发现生成的镜像的REPOSITORY和TAG都是<none>. 当执行docker run的时候提示 Unable to find image 'crm:latest' locally 联想到build的时

【无私分享:ASP.NET CORE 项目实战】目录索引

简介 首先,我们的  [无私分享:从入门到精通ASP.NET MVC]   系列已经接近尾声,还有个项目管理系统就基本完工,完工之后整套项目的源码(包括UI)和数据库都会分享给大家,希望大家在这个过程中学到了一些思路和方法,而不仅仅是拿到源码. 因为是第一次写博客,我感觉还是比较混乱的,其中很多东西没有讲明白,还有很多帮助类有的过时了,有的只是分享并没有详细解释.今天,我们用Asp.net Core 重新开发这个项目,这是个新的东西,我也是刚刚接触,还是有很多东西没有理解,我们这次从UI到后端源

ASP.NET Core下载大文件的实现

当我们的ASP.NET Core网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃.可以参考如下代码来避免这个问题. 关于此代码的几点说明: 将数据分成较小的部分,然后将其移动到响应输出流以供下载,从而获取这些数据. 根据下载的文件类型来指定 Response.ContentType .(这个网址可以找到大部分文件类型的对照表:http://tool.oschina.net/commons) 在每次调用Response.Body.Write后记得调用

ASP .NET Core 基本知识点示例 目录

ASP.NET Core 的 运行机制 文章 ASP.NET Core 中的 配置 文章 源代码 ASP.NET Core 中的 依赖注入 文章 源代码 ASP.NET Core 中的 日志 文章 源代码 ASP.NET Core 中的 缓存 文章 源代码 ASP.NET Core 中的 ORM 之 Dapper 文章 源代码 原文地址:https://www.cnblogs.com/royzshare/p/9547683.html

Tomcat web.xml中定义了文件扩展名到MIME类型的映射

Tomcat在返回静态资源时,会根据资源文件的扩展名产生对应的content-type头(也即MIME类型)添加到response header中. 在Tomcat的web.xml规定了扩展名及相应MIME的映射(占了web.xml 87%的篇幅),如下: <!-- ===================== Default MIME Type Mappings =================== --> <!-- When serving static resources, Tom