web-dev-qa-db-ja.com

セルフホストモードで現在のowinコンテキストを取得する

IISと.NETCLRセルフホストモードの両方でいくつかのASP.NETWebAPIサービスを提供するアプリケーションを実行する必要があります。OWINに基づいてASP.NETWebAPIサービスを開発しました。両方のホストで正常に動作しています。今のところ、次のようなものが必要です。

public class OwinContextInfrastructure
    {
        public static IOwinContext Current
        {
            get
            {
                if (HttpContext.Current != null)
                {
                    return HttpContext.Current.GetOwinContext();
                }
                else
                {
                    // What should I do here ?
                    return null;
                }
            }
        }
    }

アプリケーションで必要なときにいつでも現在のowinコンテキストを取得します。

私のコードはIISで正常に機能していますが、.NETセルフホストモードで何をすべきですか?

12
Yaser Moradi

まず、質問を修正する必要があります。

HttpContext.Currentは、ASP.NETに基づいて統合されたIISパイプラインであるアプリケーションで使用できます。ただし、IIS統合パイプライン。

回答:

1- IOwinContextが必要な場合は、コンストラクターインジェクションなどの依存性注入を使用して取得する必要があります。

2- Owinに基づいて機能するようにすべてを構成します。SignalRはOwinベースのみですが、Web Apiとowinを一緒に使用し、サーバー側のビューがある場合はnancyを使用します。 IISまたはASP.NETハンドラーとモジュールを作成する代わりに、owinミドルウェアを開発します。

3- Autofac.Owin&AutoFac.WebApi&AutoFac.WebApi.Owin&Autofac.SignalRを使用して、アプリケーションにあるすべてのowinミドルウェアで機能する依存性注入を設定できます。

4- Autofacは、Web APIコントローラー、シグナルハブ、およびowinミドルウェアをインスタンス化し、コンストラクターインジェクションを使用して必要なクラスにIOwinContextインスタンスを渡します。

私のテストは、Owin IIS/Helios(asp.netなし)、Owin SelfHost、さらにはOwin TestServerでも問題ありません。

このアプローチは、asp.netvNextに似ています。本番環境の準備ができたら、アプリをasp.netvNextに簡単に移行できます。

1
Yaser Moradi

Request.GetOwinContext()は、ウェブホスティングとセルフホスティングの両方に使用できます。 GetOwinContextHttpRequestMessageの拡張メソッドであり、System.Web.Http.Owin.dllアセンブリで定義されています。

更新

私はあなたの最初の質問に答えました。それは、ウェブホスティングとセルフホスティングの両方でOWINコンテキストを取得する方法です。これで、コメントの追加の質問を通じて、質問の範囲が大幅に広がりました。しかし、根本的な問題があります。 IOwinContextはOWINのものではなく、カタナのものです。 OWINでホストされているフレームワークがIOwinContextの形式でコンテキストを提供することは期待できません。 ASP.NET Web APIはそうしますが、すべてのフレームワークがそうすることになっているわけではありません。 IOwinContextはOWIN環境ディクショナリを抽象化したものであり、このディクショナリはすべてのOWINミドルウェアで使用できます。ただし、フレームワーク上で作業することにより、OWIN環境に直接アクセスすることはできなくなりますが、その特定のフレームワークがコンテキストを公開することを決定した方法によってのみアクセスできます。

ナンシーの場合、NancyContextを使用してItemsディクショナリにアクセスし、キー「OWIN_REQUEST_ENVIRONMENT」に対応する値を探す必要があります。 SignalRの場合、EnvironmentIRequestプロパティを使用すると、OWIN環境にアクセスできます。 OWIN環境ができたら、その環境を使用して新しいOwinContextを作成できます。

16
Badri