2016-11-15 44 views
2

我使用的是asp.net核心,並且我希望在調用完整的Web應用程序之前從請求中獲取多個數據。在一箇中間件中定義一個變量,可用於下列變量

所以我創建了一箇中間件來做到這一點。我發現了一個方法來檢查我想要的一切,但我不知道如何將一個變量傳遞給下面的中間件

app.Use(async (context, next) => { 
    var requestInfo = GetRequestInfo(context.Request); 
    if(requestInfo == null) 
    { 
     context.Response.StatusCode = 404; 
     return; 
    } 

    // How do I make the request info available to the following middlewares ? 

    await next(); 
}); 

app.Run(async (context) => 
{ 
    // var requestInfo = ??? 
    await context.Response.WriteAsync("Hello World! - " + env.EnvironmentName); 
}); 

是否有從中間件到別人傳遞數據的好辦法? (這裏我用app.Run,但我想有這一切,MVC)

回答

2

除了功能,還有另一種 - 在我看來,一個簡單的 - 解決方案:HttpContext.Items,如所描述here。根據docs,它特別設計用於存儲單個請求範圍的數據。

你的實現應該是這樣的:

// Set data: 
context.Items["RequestInfo"] = requestInfo; 

// Read data: 
var requestInfo = (RequestInfo)context.Items["RequestInfo"]; 
+0

哦,這是更簡單,是的! – glacasa

1

我找到了解決辦法:上下文包含IFeatureCollectionit is documented here

我們只需要創建一個類的所有數據:

public class RequestInfo 
{ 
    public String Info1 { get; set; } 
    public int Info2 { get; set; } 
} 

,我們把它添加到context.Features

app.Use(async (context, next) => { 
    RequestInfo requestInfo = GetRequestInfo(context.Request); 
    if(requestInfo == null) 
    { 
     context.Response.StatusCode = 404; 
     return; 
    } 

    // We add it to the Features collection 
    context.Features.Set(requestInfo) 

    await next(); 
}); 

現在是提供給OTH ERS中間件:

app.Run(async (context) => 
{ 
    var requestInfo = context.Features.Get<RequestInfo>(); 
});