20

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

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 のドキュメントは、このベスト プラクティスについて曖昧です。

ここでの Darrel Miller の回答: How should I store per request data when using OWIN to Self-Host ASP.NET Web API を使用すると、要求オブジェクトのプロパティ コレクションが最適であると思います。ミドルウェアからこのオブジェクトにアクセスするにはどうすればよいですか?

4

1 に答える 1

19

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

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

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

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

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

于 2014-12-09T13:58:15.747 に答える