web-dev-qa-db-ja.com

C#dotnet core2はミドルウェア/フィルターからコントローラーメソッドにデータを渡します

現在、dotnet core2を使用してWebアプリケーションを作成しています。

実際には、アプリケーションに渡されたURLに基​​づいて新しいクライアントを登録できる、ある種のマルチホスティングプラットフォームを作成します。

ただし、現在、クライアントを検証するためのミドルウェア/フィルターを作成したいと考えていました。

実際にやりたかったのは、データベースからオブジェクトをプルして存在するかどうかを確認することです。存在する場合は、コントローラーメソッドを呼び出してオブジェクトにアクセスできるようにします。存在しない場合は、実際に中止してエラーを表示します。ページ。

すでに行ったことは、まさにそれを実行するフィルター/ミドルウェアを作成したことですが、コントローラーメソッド内のフィルター/ミドルウェアに既にプルしたオブジェクトにアクセスする方法を見つけることができませんでした。

それを行うためのドキュメントは実際にありますか?

私は実際にそれを理解しようとしました: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/middleware?tabs=aspnetcore2xhttps:// docs .Microsoft.com/en-us/aspnet/core/mvc/controllers/filters

しかし、彼らはそれを行う方法を説明しておらず、アクションの前後に実際に何かをするだけです。

9

HttpContext.Items を使用して、オブジェクトをコンテキストに追加できます。

Itemsコレクションは、特定の1つのリクエストの処理中にのみ必要なデータを保存するのに適した場所です。コレクションの内容は、各リクエストの後に破棄されます。 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);
    }
}

その後、アクションメソッドで、値を読み取ることができます。

var mySuperAmazingObject = (SuperAmazingObject)HttpContext.Items["mySuperAmazingObject"];
14
DavidG

それを行う1つの方法(それが唯一または最良であるとは言わない)は、DIにオブジェクトのプロキシを注入させることです。ミドルウェアでオブジェクトの実際の値を設定すると、コントローラーのプロキシからアクセスできます。

注:コントローラーの代わりにメソッド呼び出しでプロキシオブジェクトを渡す場合は、[FromServices]属性でマークすることを忘れないでください。

別の方法は、オブジェクトをリクエストItemsプロパティに追加することです。しかし、それを読むときは、objectから実際のクラスにキャストする必要があります。

4
T.Aoukar