/// <summary> /// 加载资源 /// </summary> /// <param name="dashboardContext"></param> /// <returns></returns> public async Task LoadAsync(VirtualFileContext dashboardContext) { if (dashboardContext == null) { throw new ArgumentNullException(nameof(dashboardContext)); } if (string.IsNullOrWhiteSpace(dashboardContext.ResourcesName)) { throw new ArgumentNullException(nameof(dashboardContext.ResourcesName)); } //加载程序集 获取指定的资源 using (var resourcesStream = assembly.GetManifestResourceStream(dashboardContext.ResourcesName)) { if (resourcesStream == null) { return; } //添加响应类型 dashboardContext.HttpContext.Response.ContentType = dashboardContext.ContentType; //设置缓存时间 dashboardContext.HttpContext.Response.GetTypedHeaders().CacheControl = new Microsoft.Net.Http.Headers.CacheControlHeaderValue { Public = true, MaxAge = TimeSpan.FromMinutes(30) }; await resourcesStream.CopyToAsync(dashboardContext.HttpContext.Response.Body); } }
/// <summary> /// /// </summary> /// <param name="httpContext"></param> /// <param name="configurationOptions"></param> /// <returns></returns> public async Task InvokeAsync(HttpContext httpContext, IOptions <VirtualFileOptions> configurationOptions) { try { //匹配路由 if (!httpContext.Request.Path.StartsWithSegments(configurationOptions.Value.RequestPath, out PathString matched, out PathString remaining)) { await next(httpContext); return; } //获取面板路由服务 var virtualFileResource = httpContext.RequestServices.GetService <IVirtualFileResource>(); //接收请求地址 var requestPath = httpContext.Request.Path; //路由集合服务 var routeCollections = httpContext.RequestServices.GetService <IVirtualFileRouteCollections>(); //验证当前文件是否存在 var resourceInfo = routeCollections.Get(requestPath); if (resourceInfo == null) { await next(httpContext); return; } //设置上下文 var virtualFileContext = new VirtualFileContext(virtualFileResource.GetContentResourceName(resourceInfo.Item1, virtualFileResource.GetFileName(requestPath, resourceInfo.Item1)), resourceInfo.Item2, httpContext); //授权过滤器 var authorizationList = configurationOptions.Value?.Authorization; if (authorizationList != null && authorizationList.Count() > 0) { //授权处理 foreach (var item in authorizationList) { if ((await item.AuthorizationAsync(virtualFileContext))) { continue; } else { httpContext.Response.StatusCode = Convert.ToInt32(HttpStatusCode.Unauthorized); return; } } } //资源渲染服务 var virtualFileRender = httpContext.RequestServices.GetService <IVirtualFileRender>(); //处理响应 await virtualFileRender.LoadAsync(virtualFileContext); } catch (Exception ex) { var errorMsg = Encoding.UTF8.GetBytes(ex.Message); await httpContext.Response.Body.WriteAsync(errorMsg, 0, errorMsg.Length); } }