加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

浅谈ASP.NET Core静态文件处理源码探究

发布时间:2020-08-22 03:54:04 所属栏目:编程 来源:网络整理
导读:这篇文章首要先容了浅谈ASP.NET Core静态文件处理赏罚源码探讨,文中通过示例代码先容的很是具体,对各人的进修可能事变具有必然的参考进修代价,必要的伴侣们下面随

无独占偶这个类和StaticFileOptions一样也是集成自SharedOptionsBase类,独一多了IDirectoryFormatter操纵,通过它我们可以自界嗣魅展示到页面的输出情势,接下来我们就重点看下DirectoryBrowserMiddleware中间件的实现

public class DirectoryBrowserMiddleware { private readonly DirectoryBrowserOptions _options; private readonly PathString _matchUrl; private readonly RequestDelegate _next; private readonly IDirectoryFormatter _formatter; private readonly IFileProvider _fileProvider; public DirectoryBrowserMiddleware(RequestDelegate next, IWebHostEnvironment hostingEnv, IOptions<DirectoryBrowserOptions> options) : this(next, hostingEnv, HtmlEncoder.Default, options) { } public DirectoryBrowserMiddleware(RequestDelegate next, IWebHostEnvironment hostingEnv, HtmlEncoder encoder, IOptions<DirectoryBrowserOptions> options) { _next = next; _options = options.Value; //默认是提供默认目次的会见措施 _fileProvider = _options.FileProvider ?? Helpers.ResolveFileProvider(hostingEnv); //默认转达的是HtmlDirectoryFormatter范例,也就是我们看到的输出表格的页面 _formatter = options.Value.Formatter ?? new HtmlDirectoryFormatter(encoder); _matchUrl = _options.RequestPath; } public Task Invoke(HttpContext context) { //1.IsGetOrHeadMethod判定是否为Get或Head哀求 //2.TryMatchPath判定哀求的路径和配置的路径是否可以匹配的上 //3.TryGetDirectoryInfo判定按照匹配出来的路径可否查找到真实的物理路径 if (context.GetEndpoint() == null && Helpers.IsGetOrHeadMethod(context.Request.Method) && Helpers.TryMatchPath(context, _matchUrl, forDirectory: true, subpath: out var subpath) && TryGetDirectoryInfo(subpath, out var contents)) { //判定哀求路径是否是/为末了 if (!Helpers.PathEndsInSlash(context.Request.Path)) { //假如不是以斜线末了则重定向(小我私人感受直接在处事端重定向就可以了,为啥还要返回赏识器在哀求一次) context.Response.StatusCode = StatusCodes.Status301MovedPermanently; var request = context.Request; var redirect = UriHelper.BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path + "http://www.jb51.net/", request.QueryString); context.Response.Headers[HeaderNames.Location] = redirect; return Task.CompletedTask; } //返回展示目次的内容 return _formatter.GenerateContentAsync(context, contents); } return _next(context); } /// <summary> /// 按照哀求路径匹配到物理路径信息是否存在,存在则返回路径信息 /// </summary> private bool TryGetDirectoryInfo(PathString subpath, out IDirectoryContents contents) { contents = _fileProvider.GetDirectoryContents(subpath.Value); return contents.Exists; } }

这个操纵相对简朴了很多,首要就是判定哀求路径可否和预配置的路径匹配的到,假如匹配到则获取可以操纵当前目次内容IDirectoryContents然后通过IDirectoryFormatter输出怎样展示目次内容,关于IDirectoryFormatter的默认实现类HtmlDirectoryFormatter这里就不展示内里的代码了,逻辑很是的加单就是拼接成table的html代码然后输出,有乐趣的同窗可自行查察源码[点击查察HtmlDirectoryFormatter源码],假如自界说的话法则也很是简朴,首要看你想输出啥

public class TreeDirectoryFormatter: IDirectoryFormatter { public Task GenerateContentAsync(HttpContext context, IEnumerable<IFileInfo> contents) { //遍历contents实现你想展示的方法 } }

然后在UseDirectoryBrowser的时辰给Formatter赋值即可

app.UseDirectoryBrowser(new DirectoryBrowserOptions { Formatter = new TreeDirectoryFormatter() });

UseDefaultFiles

许多时辰出于安详思量可能其他缘故起因我们想在会见某个目次的时辰返回一个默认的页面或展示,这个究竟我们就必要行使UseDefaultFiles中间件,当我们设置了这此中间件,假如掷中了设置路径,那么会直接返回默认的页面信息,简朴行使方法如下

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读