web-dev-qa-db-ja.com

HttpContextを使用せずに現在のOwinContextを取得する

HttpContext.Current.GetOwinContext()

Webアプリケーションで現在のOwinContextを受け取ることができます。

OwinContext.Set<T>およびOwinContext.Get<T>リクエスト全体に存在するはずの値を保存します。

これで、webおよびconsole owinアプリケーション内で使用する必要のあるコンポーネントができました。このコンポーネントでは、現在、httpコンテキストにアクセスできません。

アプリケーションでは、スレッド機能と非同期機能を使用しています。

私もCallContextを使用してみましたが、一部のシナリオではデータが失われているようです。

では、どうすれば現在のOwinContextにアクセスできますか?または、私が自分の価値観を発揮できる他のコンテキストはありますか?

14
Boas Enkler

WebApi AuthorizationFilterを使用して以下を実行します。また、WebApiのapp.UseWebApi(app)などのミドルウェアをサポートしている場合は、MVCコントローラーとWebApiコントローラーコンテキストでもこれを実行できるはずです。

コンポーネントはOwinパイプラインをサポートする必要があります。サポートしない場合、正しいスレッドのコンテキストを取得する方法がわかりません。

だから多分あなたはあなた自身のカスタムを作成することができます

OwinMiddleware

owinスタートアップでapp.Use()を使用してこのコンポーネントを結び付けます。

詳細 ここ

マイプロパティミドルウェア

public class PropertiesMiddleware : OwinMiddleware
{
    Dictionary<string, object> _properties = null;

    public PropertiesMiddleware(OwinMiddleware next, Dictionary<string, object> properties)
        : base(next)
    {
        _properties = properties;
    }

    public async override Task Invoke(IOwinContext context)
    {
        if (_properties != null)
        {
            foreach (var prop in _properties)
                if (context.Get<object>(prop.Key) == null)
                {
                    context.Set<object>(prop.Key, prop.Value);
                }
        }

        await Next.Invoke(context);
    }
}

Owinスタートアップ構成

public void Configuration(IAppBuilder app)
{

        var properties = new Dictionary<string, object>();
        properties.Add("AppName", AppName);

        //pass any properties through the Owin context Environment
        app.Use(typeof(PropertiesMiddleware), new object[] { properties });
}

WebApi Filter

public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext context, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{

        var owinContext = context.Request.GetOwinContext();
        var owinEnvVars = owinContext.Environment;
        var appName = owinEnvVars["AppName"];
}

幸せなコーディング!

6
dynamiclynk