在.net core中全部的请求都会被请求中间件所处理,因此咱们能够经过在中间件里边添加对应的功能而后在服务中添加注入来实现对应的功能 html
文件位置:Startup.cs=>Configure方法,请求中间件的代码位置session
1.什么是中间件:mvc
中间件是组装成应用程序管道以处理请求和响应的软件。每一个组件选择是否将请求传递给流水线中的下一个组件,而且能够在管道中调用下一个组件以前和以后执行某些操做。请求代理用于构建请求管道。请求委托处理每一个HTTP请求。app
这张图已经说的很明白了,就是请求会被中间件一个接一个的处理完毕,最后才返回给客户ide
给出一个中间件的范例:函数
在网站的根目录建立类文件,而后就能够在Startup.cs=>Configure 中用以app.AddLog();的方式来调用自定义添加的中间件测试
public static class newclass { public static IApplicationBuilder AddLog(this IApplicationBuilder app) { new Common.Log.LogFactory().GetLog("中间件测试").Debug(true,"被执行"); return app; } }
2.依赖注入网站
依赖注入(DI)是实现对象与其协做者或依赖关系之间松散耦合的技术。为了执行其操做,类须要的对象不是直接实例化协做者,或使用静态引用,而是以某种方式提供给类。大多数状况下,类将经过它们的构造函数声明它们的依赖关系,容许它们遵循显式依赖原则。这种方法被称为“构造器注入”。ui
值得注意的是构造器注入的参数必须支持默认值this
public CharactersController(ICharacterRepository characterRepository, string title = "Characters") { _characterRepository = characterRepository; _title = title; }
1.session ,添加方式:
SessionOptions os=new SessionOptions(); os.IdleTimeout=new TimeSpan(0,0,15); app.UseSession(os);
3.测试
在Controller中添加引用:using Microsoft.AspNetCore.Http;
在控制器中添加:
HttpContext.Session.SetString(Guid.NewGuid().ToString(),Guid.NewGuid().ToString());
执行控制器就能够看到效果。
routers:
一样须要执行这些操做:
var trackPackageRouteHandler = new RouteHandler(context => { StringBuilder sessionstr= new StringBuilder(); sessionstr.Append("当前可用session有:<br/>"); foreach(string s in context.Session.Keys) { sessionstr.Append("key:"+s+",value:"+context.Session.GetString(s)+"<br/>"); } context.Response.Headers.Add("Content-Type","text/html;charset=UTF8"); return context.Response.WriteAsync(sessionstr.ToString()); }); var routeBuilder = new RouteBuilder(app, trackPackageRouteHandler); routeBuilder.MapRoute( "GetSessoin", "Session"); var routes = routeBuilder.Build(); app.UseRouter(routes);
3.执行完第一步session的添加若是成功的话,执行完添加session的控制器,再执行 localhost:5000/session就能看到当前的session值
注:这里的router只是一部分,还包含mvc下的router规则,他们之间的关系是与的关系,也就是说,无论是在mvc中定义的规则,仍是这里定义的规则都会执行。
重定向和重写,这里实现一个简单的文件下载功能,符合个人路由规则,就下载对应的文件
1.要实现如上功能须要添加对 Microsoft.AspNetCore.Rewrite的引用添加 --nuget Microsoft.AspNetCore.Rewrite ...
2.在Configure中添加代码
RewriteOptions options = new RewriteOptions() .AddRewrite("^(.*)/(.*)$","xmlOption/Get/$2.$1",true) .AddRedirect("^sf/(.*).xml","xml/$1");//$1--bug app.UseRewriter(options);
解释一下
AddRewrite("^(.*)/(.*)$","xmlOption/Get/$2.$1",true)
这里的意思就是匹配 任意字符/任意字符 ,知足条件就执行 xmlOption/Get/$2.$1 这个控制器【$1,$2是占位符】,下同
添加下载的控制器
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; using System.IO; using System.Threading.Tasks; namespace Web.Controllers { public class xmlOptionController : Controller { public void Get(string id) { string filename=id; id = "sf/" + id; if (System.IO.File.Exists(id)) { string filePath = id;//路径 FileInfo fileInfo = new FileInfo(filePath); HttpContext.Response.Clear(); HttpContext.Response.Headers.Add("Content-Disposition", "attachment;filename=" + filename); HttpContext.Response.Headers.Add("Content-Length", fileInfo.Length.ToString()); HttpContext.Response.Headers.Add("Content-Transfer-Encoding", "binary"); HttpContext.Response.ContentType = "application/octet-stream"; Task t = HttpContext.Response.SendFileAsync(id,0,fileInfo.Length); t.Wait(); } else { HttpContext.Response.Headers.Add("Content-type", "text/html;charset=UTF-8"); HttpContext.Response.WriteAsync("文件不存在"); } } } }
在添加控制器以前须要将静态文件夹sf添加到项目的静态文件中,一样须要在Configure中添加静态文件夹引用
StaticFileOptions so=new StaticFileOptions(); so.FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"sf"));//这里的文件名称是真实的文件名称 so.RequestPath="/sf";//这里的/sf就是程序中映射的路径 app.UseStaticFiles(so);
到这步就能够执行对应文件的下载了
文件结构以下:
运行效果图: