2016-11-15 9 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.Itemshereを説明しました。 docsによれば、特に単一の要求の範囲のデータを格納するように設計されています。

あなたの実装では、次のようになります。

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

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

ああ、それはそう、はるかに簡単です! – glacasa

1

私は解決策を見つけた:コンテキストがIFeatureCollectionが含まれており、it 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>(); 
}); 
関連する問題