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自动地注入进去。

时间: 2024-10-12 14:42:41

ASP.NET5中间件的相关文章

ASP.NET5 中静态文件的各种使用方式

所谓静态文件,包含HTML文件,css文件.图片文件和js文件等,他们是服务器直接读取到客户端的一些资源,在这篇文章中,我们将解释关于ASP.NET5和静态文件的一些内容. 服务端的静态文件 默认情况下,静态文件被存放在项目的wwwroot目录下,而wwwroot的地址被定义在project.json文件中: { "webroot": "wwwroot", ... } 静态文件被存储在wwwroot下的任何目录中,它被客户端以相对路径的方式访问,例如,当你在Visu

了解ASP.NET5 Web应用程序结构

本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习. ASP.NET 5 针对WEB编程引入了几个新的基本概念,理解这些概念对快速开发WEB应用来说很重要.或许这些这些概念对你来说不是新的,但是对那些使用ASP.NET 和 Visual Studio 进行传统的WEB应用开发的程序员来说,这些概念可能是新的. 本文主要内容包括: ASP.NET 项目结构 Framework 运行时 pr

ASP.NET5实践01:Web项目创建、结构概述、程序运行、发布部署

1.项目创建 ASP.NET5项目模板有三种: 新建项目: 选择模板: 2.结构概述 References对应配置是project.json中: "frameworks": { "dnx451": { }, "dnxcore50": { } }, ASP.NET5开发时支持多版本的clr共存,但运行时是使用其中一种. dnxcore50是跨平台.模块化的coreclr.它有多种,如:dnx-coreclr-win-*,dnx-coreclr-li

ASP.NET5 Beta8可用性

ASP.NET5 beta8现已上都的NuGet作为一个工具升级到Visual Studio2015!此版本极大地扩展.NET核心对OS X和Linux所支持的范围.您现在可以使用网络,加密和全球化特点的跨平台!本新闻稿也包括ASP.NET5,DNX和Web工具的一些不错的改进.让我们来看看我们如何开始使用ASP.NET5 beta8. 新功能 下面是一些在ASP.NET5 beta8新功能的摘要.对于什么是新的完整列表在此版本中,请参阅beta8发行说明. 更改IIS托管模式 我们已经取得了重

ASP.NET5 静态文件

静态文件,包括HTML文件,CSS文件,图像文件和JavaScript文件,它是一个应用里所包含的资源. 1. 提供静态文件 默认的,静态文件存储在你的webroot目录下面,webroot的路径定义在project.json里面 "webroot": "wwwroot" 静态文件可以被存储在webroot下面的任何目录当中,以一个相对目录获取到.在一个默认的web应用程序当中,在webroot下面默认有三个目录css, images和js. 要获取图像路径,格式如

ASP.NET5

ASP.NET5 2015年11月30日, ASP.NET 5 RC1 已经发布,本文尝试了一下ASP.NET5项目的创见一发布到IIS.开发环境,win10 64位,visual studio2015(已更新update1).安装了 ASP.NET 5 RC1 一. 创建项目 创建项目很简单..NET Framework 版本选的最新的4.6.1.选择模板 二. 选择模板: 因为只是尝试一下,模板选的最简单的 Empty.看一下创建完的工程目录结构 果然很简单,只有“Startup.cs” 一

让ASP.NET5在Jexus上飞呀飞

就在最近一段时间,“Visual Studio 2015 CTP 5”(以下简称CTP5)发布了,CTP5的发布不仅标志着新一代的VisualStudio正式发布又向前迈出了一步,还标志着距离ASP.NET5(vNext)的正式发布不远.跟随者CTP5,KRE也从Kre beta-1.0升级到了Kre beta-2.0. 与众多.NET开发者一样,我们也一直在密切的关注ASP.NET5的发展,而作为领先的Linux.NET WebServer服务器更是如此,早在Kre beta-2.0发布前后,

ASP.NET5配置

ASP.NET5支持各种各样的配置,应用程序配置数据可以来自JSON, XML或者INI格式的文件,也能来自环境变量,你也可以自定义你自己的Configuration Provider. 1. 获取和设置配置文件 简单地,Configuration类是一个源的集合,它可以提供读或写键值对,你至少配置一个源,如下例所示: var builder = new ConfigurationBuilder(); builder.Add(new MemoryCOnfigurationSource()); v

asp.net5开发中DNX SDK版本的影响

某次asp.net5开发中遇到了一个很奇怪的问题,引用部分的nuget包没有显示任何错误,如下图: 但是编译时出现了几百个错误: 错误基本都是形如“CS0246 The type or namespace name 'Key' could not be found (are you missing a using directive or an assembly reference?) ”这种错误, 给人的第一感觉就是nuget包引用出了问题,但是不管你怎么检查就是查不出来哪里错了. 更离奇的是