ASP.NET 5中Middleware的基本用法

在ASP.NET 5里面引入了OWIN的概念,大致意思是将网站部署、服务器、中间组件以及应用分离开,这里提到的Middleware就是中间组件。

这里引用asp.net网站的介绍图

ASP.NET Core中Middleware的使用

Middleware的作用有点类似于httpmodule,服务器接收到的请求都会传递到各个Middleware,多个Middleware形成一个处理管道。

由于不针对于特定的请求,所以Middleware的执行范围是在Application之外,这种模式很适合处理日志记录,权限验证和事务处理,也可以理解为AOP的一种实现方式。

在ASP.NET 5里面,ASP.NET Identity就提供了用于权限认证的Middleware,在Startup类里面调用UseXXX的方法就可以加入支持不同权限验证的Middleware,具体可以参考ASP.NET Identity的介绍。

除了Middleware除了第三方组件提供的之外,我们还可以实现自定义的Middleware。

在ASP.NET 5里面,我们自定义一个Middleware需要继承类OwinMiddleware,如下形式

public class LoggerMiddleware : OwinMiddleware
{
    private readonly ILog _logger;   public LoggerMiddleware(OwinMiddleware next, ILog logger) : base(next)
    {
        _logger = logger;
    }   public override async Task Invoke(IOwinContext context)
    {
        _logger.LogInfo("Middleware begin");
        await this.Next.Invoke(context);
        _logger.LogInfo("Middleware end");
    }
}
Middleware In ASP.NET 5

 构造方法传入了下一个Middleware的实例,用于在执行完当前Middleware之后,执行下一个Middleware。

然后在Startup的Configuration方法里调用
public class Startup
{
   public void Configuration(IAppBuilder app)
   {
      app.Use<LoggerMiddleware>(new TraceLogger());
   }
}
以上是ASP.NET 5中Middleware的使用简述。
————————————————————————————————————————————————————————————————————


ASP.NET Core的Middleware的用法
而在最新版的ASP.NET Core中Middleware的使用方式有了变化,下面通过一步步来看如何在ASP.NET Core中创建自定义的Middleware,描述一下新版中如何是定义Middleware以及多个Middleware的调用
1.创建一个空白的ASP.NET Core Web项目

ASP.NET Core中Middleware的使用

ASP.NET Core中Middleware的使用

2.然后在项目的根目录创建一个Middlewares文件夹

ASP.NET Core中Middleware的使用

3. 接下来将创建多个不同功能的Middleware

a.创建输出内容的Middleware

 在没有使用任何Middleware时,这时候的项目能运行,运行之后只会输出Hello World。那是因为在Startup的Configure方法里,有一个默认的Run

    app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World!");
            });

 不管输入什么url路径,都只会返回Hello World,这也可以理解为一个Middleware,是一个兜底的处理。

 其实在ASP.NET Core里面,MVC的引入也是通过Middleware的形式实现的,在引入MVC的组件后,可以通过app.UseMvc()方法引入组件,这里不详述。

 回到即将创建的自定义的Middleware,在新版中创建自定义的Middleware,不需要继承OwinMiddleware类,也没有提供这类的定义。

 自定义的Middleware看起来跟普通的class没什么区别,下面在Middlewares文件夹新建一个ContentMiddleware类,然后编写代码如下

using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;

namespace CustomMiddleware.Middlewares
{
    public class ContentMiddleware
    {
        private RequestDelegate _nextDelegate;

        public ContentMiddleware(RequestDelegate nextDelegate)
        {
            _nextDelegate = nextDelegate;
        }

        public async Task Invoke(HttpContext httpContext)
        {
            if (httpContext.Request.Path.ToString().ToLower() == "/middleware")
            {
                await httpContext.Response.WriteAsync(
                    "Handled by content middleware", Encoding.UTF8);
            }
            else
            {
                await _nextDelegate.Invoke(httpContext);
            }
        }
    }
}
ContentMiddleware

相关文章: