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

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

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

和之前的要领千篇一致,都是担任自SharedOptionsBase,通过DefaultFileNames我们可以设置默认文件的名称,默认是default.html/htm和index.html/htm。我们直接查察中间件DefaultFilesMiddleware的源码[点击查察源码]

public class DefaultFilesMiddleware { private readonly DefaultFilesOptions _options; private readonly PathString _matchUrl; private readonly RequestDelegate _next; private readonly IFileProvider _fileProvider; public DefaultFilesMiddleware(RequestDelegate next, IWebHostEnvironment hostingEnv, IOptions<DefaultFilesOptions> options) { _next = next; _options = options.Value; _fileProvider = _options.FileProvider ?? Helpers.ResolveFileProvider(hostingEnv); _matchUrl = _options.RequestPath; } public Task Invoke(HttpContext context) { //1.我们行使UseDefaultFiles中间件的时辰要置于UseRouting之上,不然就会不见效 //2.IsGetOrHeadMethod判定哀求为Get或Head的环境下才见效 //3.TryMatchPath判定哀求的路径和配置的路径是否可以匹配的上 if (context.GetEndpoint() == null && Helpers.IsGetOrHeadMethod(context.Request.Method) && Helpers.TryMatchPath(context, _matchUrl, forDirectory: true, subpath: out var subpath)) { //按照匹配路径获取物理路径对应的信息 var dirContents = _fileProvider.GetDirectoryContents(subpath.Value); if (dirContents.Exists) { //轮回设置的默认文件名称 for (int matchIndex = 0; matchIndex < _options.DefaultFileNames.Count; matchIndex++) { string defaultFile = _options.DefaultFileNames[matchIndex]; //匹配设置的启用默认文件的路径+遍历到的默认文件名称的路径是否存在 var file = _fileProvider.GetFileInfo(subpath.Value + defaultFile); if (file.Exists) { //判定哀求路径是否已"http://www.jb51.net/"末了,假如不是则从定向(这个点小我私人感受可以改造) 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; } //假如匹配的上,则将设置的启用默认文件的路径+遍历到的默认文件名称的路径组合成新的Path交给_next(context) //好比将构成相同这种路径/staticfiles/index.html向下转达 context.Request.Path = new PathString(context.Request.Path.Value + defaultFile); break; } } } } return _next(context); } }

这此中间件的实现思绪也很是简朴首要的事变就是,匹配设置的启用默认文件的路径+遍历到的默认文件名称的路径是否存在,假如匹配的上,则将设置的启用默认文件的路径+遍历到的默认文件名称的路径组合成新的Path(好比/staticfiles/index.html)交给后续的中间件行止理赏罚。这里值得留意的是UseDefaultFiles 必必要共同UseStaticFiles一路行使,并且注册位置要呈此刻UseStaticFiles之上。这也是为什么UseDefaultFiles只必要匹配到默认文件地址的路径并从头赋值给context.Request.Path既可的缘故起因。
虽然我们也可以自界说默认文件的名称,由于只要能匹配的到详细的文件既可

(编辑:湖南网)

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

热点阅读