当前位置: 移动技术网 > IT编程>开发语言>.net > asp.net mvc core 管道以及拦截器初了解

asp.net mvc core 管道以及拦截器初了解

2020年03月12日  | 移动技术网IT编程  | 我要评论

电视剧我的灿烂人生,热火vs步行者第四场,兴荣保健足疗

今天来看一下asp.net core的执行管道。先看下官方说明:

 

 

 从上图可以抛光,asp.net core的执行顺序是,当收到一个请求后,request请求会先经过已注册的中间件,然后会进入到mvc的拦截器管道:

 

 

 

进入mvc管道后,根据以上顺序执行过滤校正。

ok,根据以上说明下面我们新建一个mvc的演示,将执行方式切换为控台运行:

// this method gets called by the runtime. use this method to add services to the container.
public void configureservices(iservicecollection services)
{
    services.addcontrollerswithviews(config=> 
    {
        console.writeline("execute c");
        //config.filters.add(new asyncauthorizationfilter());
        config.filters.add(new authorizationfilter());
        config.filters.add(new resourcefilter());
        //config.filters.add(new asyncresourcefilter());
        config.filters.add(new actionfilter());
        //config.filters.add(new asyncactionfilter());
        config.filters.add(new resultfilter());
        //config.filters.add(new asyncresultfilter());
        config.filters.add(new exceptionfilter());
        //config.filters.add(new asyncexceptionfilter());
        console.writeline("execute d");
    });
    services.addsession(config=> {
        console.writeline("execute e");
    });
}

// this method gets called by the runtime. use this method to configure the http request pipeline.
public void configure(iapplicationbuilder app, iwebhostenvironment env)
{
    if (env.isdevelopment())
    {
        app.usedeveloperexceptionpage();
    }
    else
    {
        app.useexceptionhandler("/home/error");
    }
    app.usestaticfiles();
    app.userouting();
    app.useauthorization();
    app.use(async (context, next) =>
    {
        console.writeline("execute f");
        await context.response.writeasync("hello world");
        console.writeline("execute g");
    });
    //app.usesession();
    app.useendpoints(endpoints =>
    {
        console.writeline("execute a");
        endpoints.mapcontrollerroute(
            name: "default",
            pattern: "{controller=home}/{action=index}/{id?}");
        console.writeline("execute b");
    });
}

执行结果:

 

 

 

不多做解释,从从这里我们可以抛光符合官方说明文档。

看完中间件执行顺序,下面我们来了解下mvc拦截器的使用与执行顺序。

根据mvc filter管道执行顺序,我们分别来看下用法:

1)authorizationfilter:该拦截器是优先级最高的,当请求进入mvc后,首先会被authorizationfilter验证是否有权限访问,无权限则跳出。

同步用法:

public class authorizationfilter: iauthorizationfilter
{
    public void onauthorization(authorizationfiltercontext context)
    {
        context.httpcontext.response.writeasync("authorization filter \r");
    }
}

异步用法:

public class asyncauthorizationfilter: iasyncauthorizationfilter
{
    public async task onauthorizationasync(authorizationfiltercontext context)
    {
        await context.httpcontext.response.writeasync($"async authorization filter in \r");
    }
}

2)resourcefilter:该拦截器是作为第二道拦截器,

onresourceexecuting在模型绑定之前运行代码。onresourceexecuted在管道的其余阶段完成之后运行代码。

同步用法:

public class resourcefilter: iresourcefilter
{
    public void onresourceexecuting(resourceexecutingcontext context)
    {
        context.httpcontext.response.writeasync($"resource executing\r");
    }
    public void onresourceexecuted(resourceexecutedcontext context)
    {
        context.httpcontext.response.writeasync($"resource executed \r");
    }
}

异步用法:

public class asyncresourcefilter: iasyncresourcefilter
{
    public async task onresourceexecutionasync(resourceexecutingcontext context, resourceexecutiondelegate next)
    {
        await context.httpcontext.response.writeasync($" async resource filter in. \r\n");
        await next();
        await context.httpcontext.response.writeasync($"async resource filter out. \r\n");
    }
}

3)actionfilter:在调用操作方法之前和之后立即运行代码;可以更改传递到操作中的参数;可以更改从操作返回的结果。

同步用法:

public class actionfilter: iactionfilter
{
    public void onactionexecuting(actionexecutingcontext context)
    {
        context.httpcontext.response.writeasync($"action executing \r");
    }

    public void onactionexecuted(actionexecutedcontext context)
    {
        context.httpcontext.response.writeasync($"action executed . \r");
    }
}

异步用法:

public async task onactionexecutionasync(actionexecutingcontext context, actionexecutiondelegate next)
{
    await context.httpcontext.response.writeasync($"async action execution in. \r\n");
    await next();
    await context.httpcontext.response.writeasync($"async action execution out. \r\n");
}

4)onexception:在向响应正文写入任何内容之前,对声明处理的异常应用变量策略

同步用法:

public class exceptionfilter: iexceptionfilter
{
    public void onexception(exceptioncontext context)
    {
        context.httpcontext.response.writeasync($"exception \r");
    }
}

异步用法:

public class asyncexceptionfilter: iasyncexceptionfilter
{
    public task onexceptionasync(exceptioncontext context)
    {
        context.httpcontext.response.writeasync($"exception async \r");
        return task.completedtask;
    }
}

5)resultfilter:在执行操作结果之前和之后立即运行代码;仅当操作方法成功执行时,其才会运行。 可以设置格式化返回结果: 

同步操作:

public class resultfilter: iresultfilter
{
    public void onresultexecuting(resultexecutingcontext context)
    {
        context.httpcontext.response.writeasync($"result executing\r");
    }
    public void onresultexecuted(resultexecutedcontext context)
    {
        context.httpcontext.response.writeasync($"result executed \r");
    }
}

异步用法:

public class asyncresultfilter: iasyncresultfilter
{
    public async task onresultexecutionasync(resultexecutingcontext context, resultexecutiondelegate next)
    {
        await context.httpcontext.response.writeasync($"result execution async in \r");
        await next();
        await context.httpcontext.response.writeasync($"result execution async out. \r");
    }
}

注册方式我们就是用分区注册,已经在上面说明,不再多做表述,下面我们看下运行情况(页面输出):

 

 定义一个异常看下结果:

public iactionresult privacy()
{
    throw new exception("error");
}

 

ok,目标达成,不多说了,下次再看拦截器具体实现。

参考文档:asp.net core 中的筛选器

原创,转载注明出处。

 

 

 

 

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网