ASP.NET5中间件

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".);});
ar3
  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⾃动地注⼊进去。

本文发布于:2024-09-23 09:33:55,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/160841.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:请求   委托   中间件   组件   管道   程序
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议