以前使用.Net Framwork部署web时需要IIS进行部署 ,在IIS中的虚拟目录、默认文档、MIME、、等等都是已经帮我们处理好了,但是在aspnet core中需要我们自处理,框架自带为我们提供了几个中间件 ,需要在请求管道中自行进行处理过滤等。
下面我将详细的介绍框架自带的几个静态文件、目录文档中间件。
aspnet core提供的mvc、razorpage、webapi模板都是可以用来开发web项目的,那么细心的童鞋会注意到项目结构中新建wwwroot
文件夹会自动映射成这样的结构。
这是框架中默认wwwroot
为静态文件虚拟目录文件夹,内部可以存放js、css、html、image
等等常用文件。
从下图中可以看到UseStaticFiles
方法件默认有三个重载,下面会进行一一尝试 。
当我们没有注册静态文件中间件时并不能访问wwwroot
文件夹下的文件。
在Configure
方法中注册静态文件中间件。
app.UseStaticFiles();
在某些业务场景中我们可能需要自建立静态文件的路径,例如上传文件需要自己建立的文件夹来进行存储等。
这时就需要使用到UseStaticFiles
另外两个重载方法。
app.UseStaticFiles(new StaticFileOptions
{
RequestPath = new Microsoft.AspNetCore.Http.PathString("/file"),
ServeUnknownFileTypes = true,
//这里需要传递绝对路径
//FileProvider = new PhysicalFileProvider("files")
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "files"))
});
StaticFileOptions
常用属性解释:
我们新建一个files文件夹用来存放自己的文件。
这时我们测试访问 https://localhost:5001/file/特殊文件不能访问.png
下面的截图不要搞混淆了,我这里顺带一起解释了ServeUnknownFileTypes
,访问上面的地址会访问到我测试了没有设置ServeUnknownFileTypes
的时候访问Dockerfile
文件出现的404截图。
设置ServeUnknownFileTypes=true
能正常访问未支持的文件了。
设置RequestPath
可以对内的文件夹目录做一个封闭,这样能够不暴露内部的目录结构。
上面这样的静态文件这样暴露出来对于使用者来说根本不知道路径是怎样的,接下来会引入另外一个浏览器目录中间件
注静态文件、目录结构中间件
app.UseStaticFiles();
app.UseDirectoryBrowser();
这时我们可以看到wwwroot
文件夹下的静态文件,这样能够很方便的给使用者一目了然的知道静态文件的结构是怎样的。
注意:这里使用默认的目录结构只会显示出wwwroot下的静态文件,并没有显示出上面提及的files下的静态文件。
有时候并不会将wwwroot
下的所有目录展示出来,可以自行定义展示的目录,例如只展示html文件夹的文件。
app.UseStaticFiles();
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/html"))
});
注意:这里只是目录结构的展示进行了约束,其他静态文件照样是可以访问的。
我们指定展示上面介绍的自定义文件。
app.UseStaticFiles(new StaticFileOptions
{
RequestPath = new Microsoft.AspNetCore.Http.PathString("/file"),
ServeUnknownFileTypes = true,
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "files"))
});
app.UseDirectoryBrowser(new DirectoryBrowserOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "files")),
RequestPath = new Microsoft.AspNetCore.Http.PathString("/file")
});
这时点击静态文件就能够进行正常访问了,仔细的童鞋应该发现了我们的静态文件、目录都是指定的同一个路径和访问地址,经过我测试了要是请求地址没有进行统一的话会照样访问不到的,想道理也能够明白,目录结构的访问路径肯定要和请求路径统一。
那么这样是不是觉得很麻烦呢????
注册融合静态文件、目录结构中间件。
app.UseFileServer(true);
这时照样能够正常的访问,这里不设置EnableDirectoryBrowsing=true
也还是不会展示目录结构的。
``
设置EnableDefaultFiles
是否启用默认文档,例如访问 **https://localhost:5001/html/**时自动采用了index.html,我猜想这里的默认文档应该和iis中设置的默认文档是一个意思。
app.UseFileServer(new FileServerOptions
{
EnableDefaultFiles=true,
EnableDirectoryBrowsing=true
});
注意:当启用了默认文档时在展示目录结构的时候并不会定位到和默认文档同级文件夹下的内容。
例如直接点击html时并不会展示html文件夹下的目录结构,而是直接访问了默认文档。根据自己的使用场景可以自定决定是否开启默认文档。
由于在公司的时候工作比较多并且繁琐,文章更新的不频繁,还是尽量坚持每周至少更新一批文章,写文章不易 ,希望能够帮助到园子里面的童鞋。喜欢的话可以点个赞和关注一波。
源代码地址:https://github.com/jonny-xhl/my-demo/tree/master/src/files/Jonny.AllDemo.StaticFile