webdevqa.jp.net

OwinContextの環境を使用して、リクエストごとにアプリケーション固有のデータを保持する必要があります

リクエストごとにログオブジェクトを保存する方法が必要です。 HttpContextを使用して、これをアイテム辞書に追加します。私がそれを助けることができるならば、私はこれにHttpContextを持ち込みたくありません。以下のコードは、OwinミドルウェアでアクセスできるOwinContextのEnvironmentプロパティにオブジェクトを格納するUnity LifeTimeManagerに提案するものです。

public class OwinContextLifetimeManager : LifetimeManager
{
    private string key = (new Guid()).ToString();
    private IDictionary<string, object> environment;

    public OwinContextLifetimeManager(IDictionary<string, object> environment)
    {
        this.environment = environment;
    }

    public override object GetValue()
    {
        if (environment != null && environment.ContainsKey(key))
            return environment[key];
        else
            return null;
    }

    public override void RemoveValue()
    {
        if (environment != null)
            environment.Remove(key);
    }

    public override void SetValue(object newValue)
    {
        if (environment != null)
            environment[key] = newValue;
    }
}

次に、ミドルウェアから次のように使用できます。

container.RegisterType<IRequestLog, RequestLog>(new OwinContextLifetimeManager(environment));

Owinによってすでに予約されているキーを除いて、必要なキーを選択できることに気付きました。この目的でOwinContext.Environmentを使用すべきではない理由はありますか? MSDNのドキュメントは、このベストプラクティスについてあいまいです。

ここでのDarrelMillerの応答: OWINを使用してASP.NET Web APIをセルフホストする場合にリクエストごとのデータを保存する方法 リクエストオブジェクトのプロパティコレクションが進むべき道であると私は信じています。ミドルウェアからこのオブジェクトにアクセスするにはどうすればよいですか?

18
codetoast

OWIN環境ディクショナリは、リクエストごとのデータを格納するために使用できます。リクエストオブジェクトのプロパティコレクションを使用して同じことを行うことができます。

主な違いは、OWIN環境ディクショナリはOWINの概念であり、OWINホストで実行されているすべてのミドルウェアに適用できることです。リクエストオブジェクトのプロパティコレクションはASP.NETWeb APIの概念であり、その特定のフレームワークにのみ適用できます。

ところで、ASP.NET Web API自体はOWINパイプラインのミドルウェアとして実行されます。したがって、質問に答えるために、ミドルウェアからWeb APIのリクエストプロパティコレクションにアクセスすることはできません。これは、Web APIミドルウェア(またはその特定のフレームワーク)にのみ適用できるためです。

横断的関心事をOWINミドルウェアとして記述したい場合は、OWIN環境辞書を使用する必要があります。フィルタやメッセージハンドラなどのWebAPI拡張ポイントに問題がない場合は、プロパティコレクションを使用できます。

明らかに、Web API拡張ポイントを利用して記述したものはすべてWeb APIにのみ適用できますが、OWINミドルウェアはOWINパイプラインで実行され、Web APIを含むあらゆる種類のアプリに適用できます。

17
Badri