我可以按任意顺序将中间件应用到应用程序吗?

Cra*_*Man 5 c# asp.net middleware

在 C# ASP.NET 中,中间件应用程序的顺序重要吗?

以下2个代码片段:

public class Startup
{
    ...
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        setUpMVCRoutes(app);
        app.UseSwaggerUi("foobar/api", "/foobar/v3/api.json");
        app.UseSwaggerGen("foobar/{apiVersion}/api.json");
        app.UseDefaultFiles();
        app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
        app.UseStaticFiles();
        app.UseIdentity();
        app.UseCookieAuthentication();
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

和这个

public class Startup
{
    ...
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseIdentity();
        app.UseCookieAuthentication();
        app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
        app.UseDefaultFiles();
        app.UseStaticFiles();
        setUpMVCRoutes(app);
        app.UseSwaggerGen("foobar/{apiVersion}/api.json");
        app.UseSwaggerUi("foobar/api", "/foobar/v3/api.json");
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

有什么区别吗?我想,如果这个中间件的工作方式类似于 python 装饰器,或者只是执行某些操作并将结果传递给下一个函数的函数管道,那么它可能很重要。

Mat*_*zer 4

它与 ASP.NET 无关,但与 OWIN 托管实现有关。

顺序很重要。例如,如果您注册一个应该在任何其他中间件之后侦听错误的中间件,则有可能无法记录某些错误。

这只是一个假设的案例,但它可以很好地提示您如果更改中间件注册的顺序,其他场景可能会如何工作。

或者只是执行某些操作并将结果传递给下一个函数的函数管道,那么这可能很重要。

就是这样!这就是为什么顺序很重要的原因。