为了账号安全,请及时绑定邮箱和手机立即绑定

Asp.Net Core 2.x 中间件语法

Asp.Net Core 2.x 中间件语法

C#
BIG阳 2021-08-22 15:32:07
我在Startup.Configure()方法中遇到过几种直接写简单中间件的方法:// Syntax 1.app.Use((context, next) =>{    context.Response.Headers.Add("X-Content-Type-Options", "nosniff");    return next();});// Syntax 2.app.Use(async (context, next) =>{    context.Response.Headers.Add("X-Content-Type-Options", "nosniff");    await next();});// Syntax 3.app.Use(async (context, next) =>{    context.Response.Headers.Add("X-Content-Type-Options", "nosniff");    await next.Invoke();});// Syntax 4.app.Use(next =>{    return ctx =>    {        ctx.Response.Headers.Add("X-Content-Type-Options", "nosniff");        return next(ctx);    };});他们都一样吗?
查看完整描述

2 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

语法 1 和语法 2 在功能上是不同的。语法 1 不等待next()完成其Task. 语法 1 将一个普通的 lambda 函数传递给Use并返回Task而不等待它完成。语法2传递一个asynclambda函数是awaiting在Task返回之前。该await关键字告诉应用程序暂停执行,直到next()任务完成。在您的示例代码中,这可能不会导致功能差异,但有时等待 aTask完成可能会有所不同。


语法 2 和语法 3 在语法上不同,但在功能上相同。语法 2 只是语法 3 的用户友好版本。参见Func<T>() 与 Func<T>.Invoke()


语法 1 和语法 4 在语法上不同,但在功能上相同。语法 1 只是语法 4 的用户友好包装。请参阅UseExtension.cs


// syntax 1,2,3 use this 

public static IApplicationBuilder Use(

    this IApplicationBuilder app, 

    Func<HttpContext, Func<Task>, Task> middleware)

{

    // which calls into syntax4

    return app.Use(next =>

    {

        return context =>

        {

            Func<Task> simpleNext = () => next(context);

            return middleware(context, simpleNext);

        };

    });

}


查看完整回答
反对 回复 2021-08-22
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

语法 4 是使用Use方法IApplicationBuilder


IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)

语法 1、2 和 3 正在使用扩展方法,IApplicationBuilder该方法是语法 4 中先前方法的包装器。这是实现


public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware)

{

    return app.Use(next =>

    {

        return context =>

        {

            Func<Task> simpleNext = () => next(context);

            return middleware(context, simpleNext);

        };

    });

}

对于语法2和3,有没有区别next.Invoke()和next()。它们都编译为相同的方法。


查看完整回答
反对 回复 2021-08-22
  • 2 回答
  • 0 关注
  • 166 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信