2017-04-25 81 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

是的,它也讓我感到困惑。但是,它是配置中間件的一種非常簡潔而強大的方式。 –

相關問題