IStartupFilter在asp.net核心中有什么意义?

时间:2018-07-20 07:46:54

标签: asp.net-core

IStartupFilter是库向应用程序添加中间件的机制的基础。根据{{​​3}},“ IStartupFilter对于确保中间件在应用程序的请求处理管道的开始或结束时在库添加的中间件之前或之后运行非常有用”。

该机制是否允许您以Startup.Configure()无法完成的任何方式来操纵管道?

如果要点是模块化,那么您似乎只是在通过Startup.Configure()进行交易,而要通过IServicesCollection进行交易(需要调用DI)。在简单的情况下(按照Docs),可以从ConfigureServices()中删除对services.AddTransient<IStartupFilter, ...>()的调用,并可以添加app.AddMiddleware<MyMiddleware>()来实现相同的功能,并且复杂度和魔术性更低。 / p>

该机制的主要目的是允许库应用关于应包括哪些中间件的条件吗?如果是这样,则似乎缺乏asp.net核心的惯用经济性和设计的清晰度。

4 个答案:

答案 0 :(得分:4)

在简单的情况下(如示例所示),可以从ConfigureServices()和app.AddMiddleware()中删除对services.AddTransient()的调用,从而以更少的复杂性和魔力实现相同的功能。

那是不正确的。

使用IStartupFilter与使用中间件之间有很大的区别。中间件是请求管道的一部分,这意味着它会在每个请求中执行。另一方面,IStartupFilter在应用程序启动时被执行一次。

答案 1 :(得分:1)

要回答我自己的问题,我认为主要用例是使框架能够合并在构建时未知的程序集。文档在aspnetcore / Fundamentals / Host nhance an app from an external assembly in ASP.NET Core with IHostingStartup中对此进行了介绍。 (尽管文档中没有提及相关的 StartupDiagnostics 示例项目 IStartupFilter

答案 2 :(得分:1)

IStartupFilter通常在您不希望应用作者干预的情况下使用,即您不希望该应用调用。Usexxxx()被调用,但其他组件应配置该中间件。现在,考虑一种即使没有执行请求管道也要执行某些代码的方案。 让我们接受一个不存在的URI并返回404错误,在这种情况下,请求处理管道将不会执行,而启动过滤器将会执行。

答案 3 :(得分:1)

一个简单的答案是“否”,它不会添加任何新功能。

IStartupFilter背后的观点是,按照您的Startup.Configure方法的变化方式,以预定的顺序独立运行某些内容。它只是创建它们在IApplicationBuilder(WebHostBuilder)上执行操作的方法序列,以构建中间件管道。您可以定义在调用Startup.Configure方法之前或之后执行的操作。

您的IStartupFilter实现看起来与此类似:

public class ExampleStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            // This will run before the Startup.Configure
            builder.UseMiddleware<PreStartupConfigureRegisteredMiddleware>();
            // This is Startup.Configure (or the next IStartupFilter.Configure in the sequence)
            next(builder);
            // This will run after Startup.Configure
            builder.UseMiddleware<AfterStartupConfigureRegisteredMiddleware>();
        };
    }
}

可以说,由于您必须在IStartupFilter方法中注册Startup.ConfigureServices,并且过滤器的注册顺序是将要执行的顺序,因此与直接的顺序相比没有太大区别UseMiddlewareStartup.Configure的注册。

我看到的唯一好处是,无论使用什么其他中间件,您都可以注册在管道中第一个或最后一个绝对运行的东西。然后,您不必担心Configure方法中的更改。但是,应该很少使用它。

Andrew Lock写了一篇很好的博客文章,解释IStartupFilter的工作原理,请在这里查看: https://andrewlock.net/exploring-istartupfilter-in-asp-net-core/

安德鲁指出的一件事是,您可以注册过滤器以在AutoRequestServicesStartupFilter自动注册的WebHostBuilder之前运行它。并不是说我会知道一个实际使用的示例。