DefaultFilesMiddleware中间件如何显示默认页面

DefaultFilesMiddleware中间件如何显示默认页面

DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容。我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会将这个文件响应给客户端。如果我们能够将针对目录的请求重定向到这个默认文件上,一切就迎刃而解了。实际上DefaultFilesMiddleware中间件的实现逻辑很简单,它采用URL重写的形式修改了当前请求的地址,即将针对目录的URL修改成针对默认文件的URL。[本文已经同步到《ASP.NET Core框架揭秘》之中]

我们照例先来看看DefaultFilesMiddleware类型的定义。和其他两个中间件类似,DefaultFilesMiddleware的构造就有一个IOptions<DefaultFilesOptions>类型的参数来指定相关的配置选项。由于DefaultFilesMiddleware中间件本质上依然体现了请求路径与某个物理目录的映射,所以DefaultFilesOptions依然派生于SharedOptionsBase。DefaultFilesOptions的DefaultNames属性包含了预定义的默认文件名,我们可以看到它默认包含四个名称(default.htm、default.html、index.htm或者index.html)。

   1: public class DefaultFilesMiddleware
   2: {
   3:     public DefaultFilesMiddleware(RequestDelegate next, IHostingEnvironment hostingEnv, IOptions<DefaultFilesOptions> options);
   4:     public Task Invoke(HttpContext context);
   5: }
   6:  
   7: public class DefaultFilesOptions : SharedOptionsBase
   8: {
   9:     public IList<string> DefaultFileNames { get; set; }
  10:  
  11:     public DefaultFilesOptions() : this(new SharedOptions()){}
  12:     public DefaultFilesOptions(SharedOptions sharedOptions) : base(sharedOptions)
  13:     {
  14:         this.DefaultFileNames = new List<string> { "default.htm", "default.html", "index.htm", "index.html" };
  15:     }    
  16: }

我们同样采用一种比较易于理解的形式重新定义这个DefaultFilesMiddleware类型以便于读者朋友理解它具体采用的请求处理逻辑。如下面的代码片段所示,DefaultFilesMiddleware和DirectoryBrowserMiddleware一样会对请求做相应的验证。如果当前目录下存在某个默认文件,那么它会将当前请求的URL修改成指向这个默认文件的URL。值得一提的是,DefaultFilesMiddleware中间件要求访问目录的请求路劲必须以字符“/”作为后缀,否则会在目前的路径上添加这个后缀并针对最终的路径发送一个重定向。

   1: public class DefaultFilesMiddleware
   2: {
   3:     private RequestDelegate         _next;
   4:     private DefaultFilesOptions     _options;
   5:   
   6:     public DefaultFilesMiddleware(RequestDelegate next, IHostingEnvironment env, IOptions<DefaultFilesOptions> options)
   7:     {
   8:         _next                     = next;
   9:         _options                  = options.Value;
  10:         _options.FileProvider     = _options.FileProvider ?? env.WebRootFileProvider;
  11:     }
  12:  
  13:     public async Task Invoke(HttpContext context)
  14:     {
  15:         //只处理GET和HEAD请求
  16:         if (!new string[] { "GET", "HEAD" }.Contains(context.Request.Method,StringComparer.OrdinalIgnoreCase))
  17:         {
  18:             await _next(context);
  19:             return;
  20:         }
  21:  
  22:         //检验当前路径是否与注册的请求路径相匹配
  23:         PathString path = new PathString(context.Request.Path.Value.TrimEnd(‘/‘) + "/");
  24:         PathString subpath;
  25:         if (!path.StartsWithSegments(_options.RequestPath, out subpath))
  26:         {
  27:             await _next(context);
  28:             return;
  29:         }
  30:  
  31:         //检验目标目录是否存在
  32:         if (!_options.FileProvider.GetDirectoryContents(subpath).Exists)
  33:         {
  34:             await _next(context);
  35:             return;
  36:         }
  37:  
  38:         //检验当前目录是否包含默认文件
  39:         foreach (var fileName in _options.DefaultFileNames)
  40:         {
  41:             if (_options.FileProvider.GetFileInfo($"{subpath}{fileName}").Exists)
  42:             {
  43:                 //如果当前路径不以"/"作为后缀,会响应一个针对“标准”URL的重定向
  44:                 if (!context.Request.Path.Value.EndsWith("/"))
  45:                 {
  46:                     context.Response.StatusCode = 302;
  47:                     context.Response.GetTypedHeaders().Location = new Uri(path.Value + context.Request.QueryString);
  48:                     return;
  49:                 }
  50:                 //将针对目录的URL更新为针对默认文件的URL
  51:                 context.Request.Path = new PathString($"{context.Request.Path}{fileName}");
  52:             }
  53:         }
  54:         await _next(context);
  55:     }
  56: }

正是因为DefaultFilesMiddleware中间件采用URL重写的方式来响应默认文件,所以它最终依赖StaticFileMiddleware中间件来响应默认文件,所以针对后者的注册时必须的。也正是这个原因,这个中间件需要优先注册以确保URL重写发生在StaticFileMiddleware响应文件之前。



ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件
ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求
ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构
ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面

时间: 2024-10-14 04:30:38

DefaultFilesMiddleware中间件如何显示默认页面的相关文章

ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面

DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会将这个文件响应给客户端.如果我们能够将针对目录的请求重定向到这个默认文件上,一切就迎刃而解了.实际上DefaultFilesMiddleware中间件的实现逻辑很简单,它采用URL重写的形式修改了当前请求的地址,即将针对目录的URL修改成针对默认文件的URL.[本文已经同步到<ASP.NET Cor

Tomcat:解决Tomcat可以在eclipse启动,却无法显示默认页面的操作

解决Tomcat可以在eclipse启动,却无法显示默认页面的操作 今天在eclipse中配置好tomcat后访问不到它的主页,但是能运行自己的项目,一直找不到原因,百度之后最后解决了这个问题,总结如下: 原因在于eclipse是调用Tomcat的接口模拟tomcat而不是真正的启动它,因此显示不了Tomcat主页 解决办法如下: 一:双击控制台的Tomcat,如图所示: 二:修改以下两个地方: 三:若上图的单选框修改不了,如图所示: 那么最简单的解决办法就是:右击控制台的Tomcat选dele

eclipse neon配置tomcat8无法显示默认页面解决方法

下载对应tomcat8版本到本地后,在eclipse中添加tomcat8的对应目录,输入http://localhost:8080时无法显示tomcat的index.jsp页面(会显示404页面).原因:Eclipse发布路径重定向了,没有放到Tomcat下的webapp中. 解决方法:在Eclipse的Server窗口中双击Tomcat v8.0,出现配置界面,选中"Use Tomcat installation(takes control of tomcat installation)&qu

图片不存在就显示默认图片

有些时候我们需要批量显示数据库中的图片,数据库中保存的当然是图片的路径.但是如果发现某些图片不存在,网页上的红叉会显得很难看,这时候我们可以选择显示默认图片来代替,这样会显得非常有人性化.鹤峰县烟草专卖局 利用 image 对象的 onerror 事件来判断,出错则更换 image 对象的 src 为默认图片的 URL. <img src="http://www.nowamagic.net/images/new_logo.png" onerror="javascript

设置网站默认页面

 在网站开发过程中,我们通常会有这样的需求:网站访客输入域名后,在浏览器中显示默认的页面,无需在后面输入默认页面的名称,虽然输入默认页面的名称也能正确访问,但是不符合人们的习惯.(你通过htt://www.hao123.com能访问hao123的导航主页面,同样你也可以通过htt://www.hao123.com/index.html来访问hao123的导航主页面,2013-08-15测试通过,但你通常不会这么干). 目前各种Web服务器都可以配置相关网站的默认页面,IIS通过配置网站的默认

使windows server 2003 开机不显示登录页面

1.运行“regedit”,以打开“注册表管理器”:运行注册表编辑器,依次展开[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon ]分支,然后在右侧窗口双击“DefaultUserName”,接着输入你的登录用户名(默认:Administrator).如果没有预设的用户名称,可以在注册表编辑器的菜单栏点选“编辑→新建→字符串值.(s)→DefaultUserName”来添加这个项目,注意要区分大小写字母

4.项目首页、显示登录页面

首页 轮播图 admin站点配置支持图片上传 下载pillow 模块 pip install Pillow 默认情况下,Django会将上传的图片保存在本地服务器上,需要配置保存的路径. 我们可以将上传的文件保存在静态文件static目录中,添加如下上传保存目录信息. 1.把app 目录设置为环境变量中的导包路径(settings.py 中) # 把apps目录设置环境变量中的导包路径 sys.path.append( os.path.join(BASE_DIR,"luf/apps")

apache 访问默认页面及 you don&#39;t have permission to access / on this server”问题

问题一: 说明http服务器没有问题  , 找到文件所在的位置   rm -rf /etc/httpd/conf.d/welcome.conf /var/www/error/noindex.html  删掉即可. 问题二: 1. 通过apachectl -t 检测配置文件也没有问题 2.查看.conf 文件的   Allow from all 3.查看http.conf 文件中指定的用户和组的访问权限  解决链接          http://wiki.apache.org/httpd/13P

Glide加载圆形图片第一次只显示默认图片

Glide加载圆形图,又设置了默认图,很多时候第一次加载的时候只显示默认图.下面的方案可以解决.\ Glide.with(AudioDetailActivity.this) .load(cover) .placeholder(R.drawable.audio_default_normal) .into(new SimpleTarget<GlideDrawable>() { @Override public void onResourceReady(GlideDrawable resource,