c# - Asp.Net Core 2.x 中间件语法
问题描述
我在 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);
};
});
它们都一样吗?
解决方案
语法 1 和语法 2 在功能上有所不同。语法 1 不等待next()
完成其Task
. 语法 1 将一个普通的 lambda 函数传递给Use
并返回,Task
而不等待它完成。语法 2 传递一个async
lambda 函数并且是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);
};
});
}
推荐阅读
- javascript - 如何摆脱算法中的复杂性?
- google-sheets - 是否可以在 Google 工作表上显示所有执行 Importrange 或 Query 的工作表?
- amazon-web-services - nginx:在 /etc/nginx/nginx.conf:11 的上游“udagram-users:8080”中找不到 [emerg] 主机
- azure-logic-apps - Azure App Logic - 如何在 Blob 存储上分页文件
- machine-learning - 如何将不同的值传递给管道参数
- javascript - React 和 Gsap 动画问题
- sharepoint - 拉取文件时逻辑应用 Sharepoint 文件名错误
- c++ - std::move 在不同的编译器上表现不同?
- javascript - 在 Javascript 中对数据和时间字符串进行排序
- arrays - 如何创建一个包含对象数组的 PowerShell 对象?