首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Asp.Net Core2.x中间件语法

Asp.Net Core2.x中间件语法
EN

Stack Overflow用户
提问于 2018-06-20 09:33:54
回答 2查看 917关注 0票数 11

我遇到了几种直接在Startup.Configure()方法中编写简单中间件的方法:

代码语言:javascript
复制
// 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);
    };
});

它们都是一样的吗?

EN

回答 2

Stack Overflow用户

发布于 2018-06-20 11:57:39

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

语法2和语法3在语法上是不同的,在功能上是相同的。语法2只是语法3的用户友好版本。请参阅Func() vs Func.Invoke()

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

代码语言:javascript
复制
// 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);
        };
    });
}
票数 7
EN

Stack Overflow用户

发布于 2018-06-20 11:53:45

语法4正在使用IApplicationBuilderUse方法

代码语言:javascript
复制
IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)

语法1、2和3使用了IApplicationBuilder的扩展方法,该方法是语法4中以前方法的包装器。

代码语言:javascript
复制
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()之间没有区别。它们都编译成相同的方法。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50938991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档