2017-04-25 96 views
4

我正在为ASP.NET核心网站构建一个支持库。我有几个需要启用的中间件,他们需要在任何其他中间件之前添加,因为他们所做的事情。在ASP.NET Core中,有没有什么方法可以从Program.cs设置中间件?

我可以在IWebHostBuilder上创建一个扩展方法来添加服务,同样也用于配置日志记录,但我没有看到任何方式以编程方式添加中间件。有没有办法做到这一点?查看WebHost/WebHostBuilder的源代码并没有跳出来。


鉴于第一条评论,我可能不够清楚。我知道如何创建中间件并使用它。我想要做的是确保在框架启动时调用Configure(IApplicationBuilder应用程序)方法时,我的中间件已经就位。以类似的方式在启动之前即可创建ServiceConfiguration。因此,像

public static IWebHostBuilder AddPayscaleHostingServices(this IWebHostBuilder webHostBuilder, string serviceName) 
{ 
    return webHostBuilder.ConfigureServices(collection => 
    { 
     collection.RegisterPayscaleHostingServices(); 
    }).ConfigureLogging(factory => 
    { 

    }); 
} 

扩展方法给我做之前webHostBuilder.Build方法进行一些设置的能力,但我没有看到关于IApplicationBuilder中间件/任何类似的事情。

感谢, 埃里克

+0

请参考这一点,首先做自己的研究。 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware – wannadream

+0

我知道如何创建中间件,并且我知道如何添加中间件。我不知道的是如何确保在Startup类上调用Configure方法之前启用了我的中间件。在完美的世界中,我将有机会在用户代码之前触摸IApplicationBuilder。 –

回答

3

你可以使用启动过滤器来实现这一目标。启动过滤器允许您从DI容器解析的服务配置中间件。

定义启动过滤器很简单:

public class MyStartupFilter : IStartupFilter 
{ 
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next) 
    { 
     return app => 
     { 
      // Configure middleware 
      // ... 

      // Call the next configure method 
      next(app); 
     }; 
    } 
} 

始终确保调用next(app)或任何其他中间件不会配置。

现在注册启动过滤器作为一个单独的实施IStartupFilterConfigureServices方法:

services.AddSingleton<IStartupFilter, MyStartupFilter>(); 
+0

谢谢!出于某种原因,名字IStartupFilter让我思考错误的方向。现在我看一下,以及WebHost中如何使用它,这是有道理的。不是名字,但我如何使用它。 –

+0

是的,它也让我感到困惑。但是,它是配置中间件的一种非常简洁而强大的方式。 –

相关问题