ASP.NET5中间件
小的应用组件可以包含到Http请求管道当中,ASP.NET5 集成了中间件,被包在了应用程序的Configure方法当中。
1. 什么是中间件
中间件是一组被装到应用程序管道的请求和响应中的组件。每一个组件可以选择地是否把当前的请求传到下一个组件当中,可以执行一些特定的动作在下一个组件之前或者之后执行。请求委托被用来创建这样的请求管道,用来处理你应用程序的请求。
请求的委托用IApplicationBuilder的run, map, use扩展方法来配置. 在Starup的configure里面可以做这样的配置,一个单独的请求委托可以指定一个匿名的方法,或者定义在一个可重复利用的类当中。这些可重复利用的类就是中间件,或者中间组件。每个组件负责调用下一个组件,或者选择中止。
ASP.NET请求管道是由一系列的请求委托组成,一个一个地调用。如下图所示
每个委托有机会执行相应的操作在下一个委托之前或之后。任何的委托可以选择停止传递请求到下一个委托。这就是所谓的请求短路,这有时候有好的,可以避免一些不必要的工作,例如Authorization中间件在Authenticated之后调用之后的委托,当没有授权时会显示"Not Authorized", 异常处理可以捕获到,因为它在管道中早执行了。
如下是应用程序的默认配置:
public void COnfigure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
...
if(env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseIdentity();
app.UseMvc(routes => { routes.MapRout(name:"default", template:"{controller=Home}/{action=Index}/{id?}" });
}
UseExceptionHandler最先配置,这样它可以处理后续调用出现的任何异常,另外,这里的设计让请求的静态文件不需要用户的认证,这样可以提升性能,
切记:在应用配置时利用中间件的顺序是很重要的,确保你的应用程序适合你的应用场景。
一个简单的匿名的调用如下:
app.Run(async context => { await context.Response.WriteAsync("Hello, World!"); });
注意,执行完上面的这条语句,就会中止执行下面的任何语句。
再看一个例子, 在委托的参数里可以增加一个next参数,来调用下一个委托。
public void ConfigureLogInline(IApplicationBuilder app, ILoggerFactory loggerfactory)
{
loggerfactory.AddConsole(minLevel: logLevel.Information);
var logger = loggerfactory.CreateLogger(_environment);
app.Use(async (context, next) => {logger.LogInfromation();
await next.Invoke();
logger.LogInformation("Finished handling request".);});
app.Run(async context=>{ await context.Response.WriteAsync("Hello from" + _environment); });
}
注意:不在要调用next之后再修改HttpResponse, 因为后续的委托也会写,导致错乱。
2 Run, Map, and Use
一般地, 我们用run的时候,是不会调用其它的组件的,也就是不会再调next的请求委托。所以,Run只能在最后被调用。
下面两个结果是一样的
public void COnfigureEnvironmentOne(IApplicationBuilder app)
{
app.Run(async context => { await context.Response.WriteAsync("Hello from " + _environment);
}
public void ConfigureEnvironmentTwo(IApplicationBuilder app)
{
app.Use(next => async context =>{ await context.Response.WriteAsync("Hello from " + _environment);
}
Map*扩展用来分支管道,下面会演示一个基于请求路径的分支,Map扩展用来把请求的路径和处理的方法做一个映射,例子如下:
private static void HandleMapTest(IApplicationBuilder app)
{
app.Run(async context => { await context.Response.WriteAsync("Map Test Successful"); });
}
public void ConfigureMapping(IApplicationBuilder app)
{
app.Map("/maptest", HandleMapTest);
}
MapWhen方法可以支持谓词的中间分支, 例如:
public void COnfigureMapWhen(IApplicationBuilder app)
{
app.MapWhen(context => { return context.Request.Query.ContainsKey("branch"); }, HandleBranch);
app.Run(async context => { awat context.Response.WriteAsync("Hello from " + _environment); });
}
private static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context => { await context.Response.WriteAsync("Branch used."); });
}
上面的例子任何的请求参数中含有branch的都走HandleBranch分支,其它走下面的。
3. 内建的中间件
中间件 描述
Authentication 提供认证支持
CORS 配置跨源资源共享
Diagnostics 包含错误页的支持和运行时的信息
Routing 定义限制请求的路由
Session 提供管理用户会话的支持
Static Files 提供静态文件,文件夹的浏览
4. 编写中间件
对于复杂的请求处理,ASP.NET团队建议实现自己的中间件,在Configure里去调用,例如:
public class RequestLoggerMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
public RequestLoggerMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
{
_next = next;
_logger = logggerFactory.CreateLogger<RequestLoggerMiddleware>();
}
public async Task Invoke(HttpContext context)
{
_logger.LogInformation("Handling request: " + context.Request.Path);
await _next.Invoke(context);
_logger.LogInformation("Finished handling request.");
}
}
public static class RequestLoggerExtensions
{
public static IApplicationBuilder UseRequestLogger(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestLoggerMiddleware>();
}
}
在Configure方法中你可以简单地利用一行代码就搞定了。
app.UseRequestLogger();
在UseMiddleware<T>方法中ReuqestLoggerMiddleware的构造函数里的参数会被DI自动地注入进去。
ASP.NET5中间件的更多相关文章
- ASP.NET5 Beta8可用性
ASP.NET5 beta8现已上都的NuGet作为一个工具升级到Visual Studio2015!此版本极大地扩展.NET核心对OS X和Linux所支持的范围.您现在可以使用网络,加密和全球化特 ...
- ASP.NET5 中静态文件的各种使用方式
所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况 ...
- 了解ASP.NET5 Web应用程序结构
本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习. ASP.NET 5 针对WEB编程引 ...
- ASP.NET5 Beta8
ASP.NET5 Beta8 ASP.NET5 beta8现已上都的NuGet作为一个工具升级到Visual Studio2015!此版本极大地扩展.NET核心对OS X和Linux所支持的范围.您现 ...
- 让ASP.NET5在Jexus上飞呀飞
就在最近一段时间,“Visual Studio 2015 CTP 5”(以下简称CTP5)发布了,CTP5的发布不仅标志着新一代的VisualStudio正式发布又向前迈出了一步,还标志着距离ASP. ...
- 为支持ASP.NET5跨平台,Jexus再添新举措
Jexus作为一款运行于Linux/FreeBSD平台上,以支持ASP.NET著称的高性能HTTP服务器和反向代理服务器,继5.6版完成对OWIN标准应用的支持后,就把着力点放到了对ASP.NET5的 ...
- 从ASP.NET 升级到ASP.NET5(RC1) - 翻译
前言 ASP.NET 5 是一次令人惊叹的对于ASP.NET的创新革命. 他将构建目标瞄准了 .NET Core CLR, 同时ASP.NET又是对于云服务进行优化,并且是跨平台的框架.很多文章已经称 ...
- ASP.NET5,MVC 6,Beta 7与VS 2015 RTM的兼容问题
温馨提示:本文杂而乱,最终不知所云. Visual Studio 2015 RTM已经于2015年7月20号正式发布,我也在第一时间下载安装了起来. 虽然在5月份就开始使用RC版本,但是还是很期待正式 ...
- ASP.NET5 MVC6入门教学之一(自己动手)
等待微软开源大动作已经好几年了,终于ASP.NET 5发布了.今天给新手们写一个简单地教程,教你认识一下ASP.NET5 MVC6 1.安装kvm 首先,你需要以管理员权限打开cmd,执行如下的脚本: ...
随机推荐
- 阻止文件不被上传到iCloud-b
有空用下 http://www.cocoachina.com/bbs/read.php?tid=86244 http://www.ooso.net/archives/617 http://blog.c ...
- 『安全科普』WEB安全之渗透测试流程
熟悉渗透流程,攻击会像摆积木一样简单! 0x 01:信息收集 收集网站信息对渗透测试非常重要,收集到的信息往往会让你在渗透中获得意外惊喜. 1. 网站结构 可以使用扫描工具扫描目录,主要扫出网站管理员 ...
- 2D地图随机生成
2D地图随机生成基础绘图 海陆分布
- Javascript Framework Scenario
Mobile----- zepto, jQuery Scroll------ iscrollhttp://cubiq.org/iscroll-4 jo.js widget----- jquery pl ...
- 由 char()函数返回的 ASCII字符集中的功能/控制字符
如果在excel下的单元格写入公式:=“国际经济与贸易”&CHAR(10)&"401班"&CHAR(10)&"A组".则出现: ...
- .net 开发框架
.NET开发人员值得关注的七个开源项目 2010年07月02日09:33 it168网站原创 作者:黄永兵 编译 编辑:胡铭娅 我要评论(0) [IT168技术分析]微软近几年在.NET社区开源项目方 ...
- 【转】设置SecureCRT会话的缓冲区大小
原文网址:http://guanjianfeng.com/archives/1484 在使用SecureCRT操作设备时,默认的回滚行数为500行.可以通过打开[选项]->[会话选项]-> ...
- MVVM模式中WPF数据的完全绑定
一:截图,描述:将后台代码的姓名.年龄绑定到文本框,单击”增加年龄“--年龄自+1,单击”显示年龄“--弹出年龄的显示对话框,实现了从文本框修改年龄和后台更改年龄并显示到文本框 运行结果和解决方案管理 ...
- ARM机器码分析
我们编写的汇编程序还是不够底层,CPU都是对机器码进行操作的,所以还需要用汇编器将汇编代码转换成机器码才能被CPU处理.下面举几个例子来说说分析ARM机器码的方法. 对编译连接之后得到的ELF进行反汇 ...
- Jack Straws(判断线段是否相交 + 并查集)
/** http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1840 题意: 判断线段 ...