ASP.NET Core MVC/WebApi基础系列1

网络编程 2021-07-04 22:41www.168986.cn编程入门
这篇文章主要介绍了ASP.NET Core MVC/WebApi基础系列,后续会穿插讲EF Core和ASP.NET Core,虽说是基础系列但也是也有你不知道的。

>前言

最近发表的EF Core貌似有点多,可别误以为我只专攻EF Core哦,私下有时间也是一直在看ASP.NET Core的内容,所以后续会穿插讲EF Core和ASP.NET Core,别认为你会用ASP.NET Core就自认为你很了解ASP.NET Core,虽说是基础系列但也是也有你不知道的ASP.NET Core。

UseStaticFiles、UseDefaultFiles、UseDirectoryBrowser、UseFileServer

当我们创建默认.NET Core Web应用程序时,.NET Core默认为我们注入了StaticFiles从而可使用root目录下的静态文件,请注意这里注入StaticFiles是基于root目录下的静态文件,此时我们如下通过使用UseDefaultFiles启用默认静态文件。

app.UseDefaultFiles();
app.UseStaticFiles();
 

在此之前呢,我们在root目录下创建了四个静态HTML文件,如下

根据官方文档说明,我们创建如上四个静态html,也会根据如上顺序在root目录下查找静态html,查找到了default.htm,所以此时如上显示对应内容,若我们删除第一个html,则会查找default.html,以此类推。要是我们将注入顺序颠倒会这样呢?如下

app.UseStaticFiles();
app.UseDefaultFiles();

此时会出现页面404找不到页面,这是为何呢?官方文档强调必须将注入默认文件放在注入静态文件前面,主要是因为注入默认文件只是进行URL重写,告诉路由我要到root目录下查找静态文件,实际上提供静态文件的是StaticFiles,所以这也是为什么必须将注入默认文件放在注入静态文件前面。如果我们非要将注入默认文件放在注入静态文件前面,我们该如何做呢?接下来通过使用UseFileServer,UseFileServer是UseDefaultFiles和UseStaticFiles的组合体,既然是组合体,我们将UseFileServer放在第一位不就这个问题了吗,我们来试试,如下

app.UseFileServer();
app.UseStaticFiles();
app.UseDefaultFiles();

结果将会呈现默认静态html,这里我就不再演示了,有兴趣的童鞋可自行研究。接下来我们再来看看启用目录浏览,启用目录浏览和我们在IIS上启用目录浏览一样,如下

app.UseDirectoryBrowser();
app.UseFileServer();
app.UseStaticFiles();
app.UseDefaultFiles();

这里就不用我再多说,那么问题来了要是我们将启用目录浏览放到使用MVC路由后面会怎样呢?此时启用目录浏览会覆盖MVC路由?不会,可自行验证。

app.UseMvc(routes =>
 {
 routes.MapRoute(
 name: "default",
 template: "{controller=Home}/{action=Index}/{id?}");
 });
 
 app.UseDirectoryBrowser();

 自定义默认文件目录

关于修改默认文件名称等基础,官方文档有详细说明,这里就不再演示,浪费篇幅,接下来我们来重点讲解不一样的。比如默认启用静态文件,是放在root根目录下,要是我们想将静态文件放在所给第一张图中dist文件夹下呢?此时我们应该如何做呢?因为.NET Core默认将root目录作为静态文件目录,所以此时我们需要改变其目录到root目录下的dist目录,通过使用UseWebRoot方法,将Web静态目录更改到root下的dist目录,启用默认文件(UseDefaultFiles)如下

.UseWebRoot(Path.Combine(Directory.GetCurrentDirectory(), "root", "dist"))

 

那么问题又来了,此时假设我想将默认静态文件放在外部即项目根目录,此时我们应该如何做呢?比如访问如下静态html文件。

此时我们可利用UseDefaultFiles方法的重载,将目录更换到项目根目录下的OutDefaultHtml目录,如下

var fileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, 
 "OutDefaultHtml"));

 app.UseDefaultFiles(new DefaultFilesOptions()
 {
 FileProvider = fileProvider,
 DefaultFileNames = new [] { "OutDefault.html" }
 });

因为我们更换了查找静态html的目录,最终提供默认文件的是UseStaticFiles,所以我们也需要通过UseStaticFiles方法的重载切换目录不再是root,如下

app.UseStaticFiles(new StaticFileOptions()
 {
 FileProvider = fileProvider
 });

除了上述通过联合使用UseDefaultFiles和UseStaticFiles之外,是否还有更简洁的方式呢?是有的,当默认静态文件放在root目录下不再满足我们的需求时,我们需要自定义默认静态文件所放置目录时,推荐使用二者的联合体即UseFileServer。上述我们可修改成如下

var fileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath,"OutDefaultHtml"));
 var fileServerOptions = new FileServerOptions();
 fileServerOptions.DefaultFilesOptions.DefaultFileNames = new[] { "OutDefault.html"};
 fileServerOptions.FileProvider = fileProvider;

 app.UseFileServer(fileServerOptions);

 UseStaticFiles详解

在大部分情况下,我们都将静态文件放在root目录下,有那么百分之十的情况下会将静态文件放在项目根目录,那么此时使用默认注入的UseStaticFiles方法就不再适用,此时我们需要用到其重载方法。比如我们要访问如下图中的mvc_course.gif,我们该如何做呢?

上面已经讲过,需要使用UseStaticFiles方法的重载,第一个参数将目录切换到静态文件所在目录,第二个参数是虚拟路径用来访问静态文件,为了不对外暴露实际物理路径,如下

app.UseStaticFiles(new StaticFileOptions()
 {
 FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "OutStaticFiles")),
 RequestPath = "/outfiles"
 });
 
 或者

 //app.UseStaticFiles(new StaticFileOptions()
 //{
 // FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "OutStaticFiles")),
 // RequestPath = new PathString("/outfiles")
 / 

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by