2017-10-06 150 views
3

目前我們正在寫與DOTNET核心的Web應用程序2.C#DOTNET核心2遍數據

我們實際上創建某種多主機平臺的,我們可以註冊基於新客戶該網址傳遞給我們的應用程序。

但是目前我們要創建一箇中間件/過濾器來驗證我們的客戶。

其實我們想要做的是從數據庫中拉一個對象,並檢查它是否存在,如果是,我們要調用的控制方法,使訪問該對象,如果不存在的話,我們真的想放棄並顯示錯誤頁面。

我們已經完成創建一個過濾器/中間件正是這麼做的,但我們不能想出一個辦法來訪問,我們已經拉在控制器方法中我們的過濾器/中間件的對象。

有實際上是這樣做的任何文件?

其實我試圖從弄明白: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware?tabs=aspnetcore2x https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters

但他們沒有描述的方式來做到這一點,只有真正做一些事情前/後動作。

回答

4

您可以將對象添加到使用HttpContext.Items上下文該文檔狀態:

Items集合是隻存儲在處理一個特定的請求所需要的數據的好位置。該集合的內容在每次請求後被丟棄。 Items集合最適合用作組件或中間件在請求期間的不同時間點進行通信並且沒有直接參數傳遞方式時進行通信的方式。

例如,在你的中間件:

public class MySuperAmazingMiddleware 
{ 
    private readonly RequestDelegate _next; 

    public MySuperAmazingMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public Task Invoke(HttpContext context) 
    { 
     var mySuperAmazingObject = GetSuperAmazingObject(); 

     context.Items.Add("SuperAmazingObject", mySuperAmazingObject); 

     // Call the next delegate/middleware in the pipeline 
     return this._next(context); 
    } 
} 

再後來就在你的操作方法,你可以閱讀值:

3

這樣做的一種方式(不是說它是唯一的或最好的)是讓DI注入對象的代理,在中間件中設置對象的真實值,然後可以從代理訪問它在控制器中。

注意:如果你傳遞的方法調用,而不是控制代理對象,不要忘記[FromServices]屬性來標記它。

另一種方式是添加所述對象到所述請求的項目屬性。但是當你讀它,你需要從object投放到實際的類。