ASP.NET Core系列:中间件

摘要:
“);});}}第一个Run委托终止了管道。Use用于将多个请求委托链接在一起。下一个参数表示管道中的下一个委托。您可以通过不调用下一参数来短路管道。publicvoid配置{app.Use;app.Run(asyncontext=˃{awaicontext.Response.WriteAsync(“输入第二个委托”); 等待上下文。回答WriteAsync(“HelloWorld!”!
1. 概述

ASP.NET Core中的中间件是嵌入到应用管道中用于处理请求和响应的一段代码。

2.使用 IApplicationBuilder 创建中间件管道

2.1 匿名函数

使用Run, Map, Use ,MapWhen等扩展方法来实现。

usingMicrosoft.AspNetCore.Builder;
usingMicrosoft.AspNetCore.Hosting;
usingMicrosoft.AspNetCore.Http;
public classStartup
{
    public voidConfigure(IApplicationBuilder app)
    {
        app.Run(async context =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

第一个Run委托终止了管道。

用 Use 将多个请求委托链接在一起。 next 参数表示管道中的下一个委托。 可通过不 调用 next 参数使管道短路。

public voidConfigure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        context.Response.ContentType = "text/plain;charset=utf-8";
        await context.Response.WriteAsync("进入第一个委托 执行下一个委托之前
");
        //调用管道中的下一个委托
        awaitnext.Invoke();
        await context.Response.WriteAsync("结束第一个委托 执行下一个委托之后
");
    });
    app.Run(async context =>
    {
        await context.Response.WriteAsync("进入第二个委托
");
        await context.Response.WriteAsync("Hello World!
");
        await context.Response.WriteAsync("结束第二个委托
");
    });
}

2.2 自定义中间件类

新建中间件类:MyMiddleware.cs

usingMicrosoft.AspNetCore.Http;
public classMyMiddleware
{
    private readonlyRequestDelegate _next;
    //在应用程序的生命周期中,中间件的构造函数只会被调用一次
    publicMyMiddleware(RequestDelegate next)
    {
        this._next =next;
    }
    public asyncTask InvokeAsync(HttpContext context)
    {
        await context.Response.WriteAsync("Hello World!");
        await_next(context);
    }
}

将自定义中间件配置到请求处理管道中,Startup.cs文件调整:

public voidConfigure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseMiddleware<MyMiddleware>();
}

将中间件MyMiddleware改成扩展方法:

新建扩展类MyMiddlewareExtension.cs

usingMicrosoft.AspNetCore.Builder;
public static classMyMiddlewareExtension
{
    public static IApplicationBuilder UseMyMiddleware(thisIApplicationBuilder builder)
    {
        //使用UseMiddleware将自定义中间件添加到请求处理管道中
        return builder.UseMiddleware<MyMiddleware>();
    }
}

将自定义中间件配置到请求处理管道中,Startup.cs文件调整:

public voidConfigure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseMyMiddleware();
}

2.3 自定义中间件类传入初始参数

public classGreetingOption
{
    public string At { get; set; }
    public string To { get; set; }
}
usingMicrosoft.AspNetCore.Http;
public classGreetingMiddleware
{
    private readonlyRequestDelegate _next;
    private readonlyGreetingOption _option;
    publicGreetingMiddleware(RequestDelegate next, GreetingOption option)
    {
        _next =next;
        _option =option;
    }
    public asyncTask Invoke(HttpContext context)
    {
        var message = $"Good {_option.At} {_option.To}";
        awaitcontext.Response.WriteAsync(message);
    }
}
usingMicrosoft.AspNetCore.Builder;
public static classGreetingMiddlewareExtension
{
    public static IApplicationBuilder UseGreetingMiddleware(thisIApplicationBuilder app, GreetingOption option)
    {
        return app.UseMiddleware<GreetingMiddleware>(option);
    }
}
public voidConfigure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseGreetingMiddleware(newGreetingOption
    {
        At = "Morning",
        To = "Libing"
    });
}
3. IMiddleware

IMiddleware提供了强类型约束的中间件,其默认实现是MiddlewareFactory,接口定义如下:

public interfaceIMiddleware
{
    Task InvokeAsync(HttpContext context, RequestDelegate next);
}

IMiddlewareFactory用于创建IMiddleware实例及对实例进行回收,接口定义:

public interfaceIMiddlewareFactory
{
    publicIMiddleware Create (Type middlewareType);
    public voidRelease (IMiddleware middleware);
}

3.1自定义IMiddleware类型中间件

修改MyMiddleware,实现IMiddleware接口:

usingMicrosoft.AspNetCore.Http;
public classMyMiddleware : IMiddleware
{
    public asyncTask InvokeAsync(HttpContext context, RequestDelegate next)
    {
        await context.Response.WriteAsync("Hello World!");
        awaitnext(context);
    }
}

将自定义中间件配置到请求处理管道中,Startup.cs文件调整:

public voidConfigureServices(IServiceCollection services)
{
    //在服务容器中注册自定义中间件
    services.AddSingleton<MyMiddleware>();
}
public voidConfigure(IApplicationBuilder app, IHostingEnvironment env)
{
    //使用 UseMiddleware() 把自定义中间件添加到管道中
app.UseMyMiddleware();
}

免责声明:文章转载自《ASP.NET Core系列:中间件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ulimit命令介绍C# 通过ServiceStack 操作Redis——List类型的使用及示例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue单页面项目返回上一页无效,链接变化了,但是页面没有变化

在最近的项目中,返回上一页没有效果,经过好久的排查才发现问题,是路由守卫写法不规范导致。 在项目中用路由守卫做了登录拦截,没登录的跳转到登录页面。页面跳转和拦截都没问题,但是返回上一页就不行了,也没有报错。 代码贴上来 router.beforeEach((to, from, next) =>{ if (to.meta.loginChec...

spring注解(Component、依赖注入、生命周期、作用域)

1、注解 注解就是一个类,使用@加上注解名称,开发中可以使用注解取代配置文件 2、@Component 取代<bean  class="">,@Component 取代<bean id="" class=""> (1)创建一个类(该类与dao层无联系,是一个单独的类) @Component("studentService") pub...

android中getSystemService详解

http://blog.sina.com.cn/s/blog_71d1e4fc0100o8qr.html http://blog.csdn.net/bianhaohui/article/details/6220135       android的后台运行在很多service,它们在系统启动时被SystemServer开启,支持系统的正常工作,比如Mount...

Android广播机制的基本使用

一提到广播我们第一感觉就会联想到小时候村里面的广播,安卓的广播机制也是类似于大喇叭。有发送广播的地方,也有接收广播的地方。但是具体怎么操作呢,我们来一步一步的看下去~ 安卓的广播种类 系统发送的广播:具体有哪些可以看下这篇Bloghttp://blog.sina.com.cn/s/blog_7dbac1250101mt5h.html app发送的广播...

数据存储

iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3Core Data应用沙盒每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应用必须待在自己的沙盒里,其他应用不能访问该沙盒应用沙盒的文件系统目录,如下图所示(假设应...

【Android】让你的安卓app国际化、支持语言自动切换

碎碎念 我在写app的时候,无论是布局上的字符串还是代码中的,我都喜欢直接敲上去,无视那个善意提醒的波浪线。 对于小项目来说,我觉得无可厚非,虽然不规范但方便直观,不需要苦于给字符串起名字。 如果你在项目初期就想着要将应用推向国际市场,就要注意字符串一定要养成习惯全部写在string.xml里,不然后期再加真的很崩溃。 创建多语言的string.xml 我...