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セルフホストモードで何をすべきですか?
まず、質問を修正する必要があります。
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に簡単に移行できます。
Request.GetOwinContext()
は、ウェブホスティングとセルフホスティングの両方に使用できます。 GetOwinContext
はHttpRequestMessage
の拡張メソッドであり、System.Web.Http.Owin.dllアセンブリで定義されています。
更新
私はあなたの最初の質問に答えました。それは、ウェブホスティングとセルフホスティングの両方でOWINコンテキストを取得する方法です。これで、コメントの追加の質問を通じて、質問の範囲が大幅に広がりました。しかし、根本的な問題があります。 IOwinContext
はOWINのものではなく、カタナのものです。 OWINでホストされているフレームワークがIOwinContext
の形式でコンテキストを提供することは期待できません。 ASP.NET Web APIはそうしますが、すべてのフレームワークがそうすることになっているわけではありません。 IOwinContext
はOWIN環境ディクショナリを抽象化したものであり、このディクショナリはすべてのOWINミドルウェアで使用できます。ただし、フレームワーク上で作業することにより、OWIN環境に直接アクセスすることはできなくなりますが、その特定のフレームワークがコンテキストを公開することを決定した方法によってのみアクセスできます。
ナンシーの場合、NancyContext
を使用してItems
ディクショナリにアクセスし、キー「OWIN_REQUEST_ENVIRONMENT」に対応する値を探す必要があります。 SignalRの場合、Environment
のIRequest
プロパティを使用すると、OWIN環境にアクセスできます。 OWIN環境ができたら、その環境を使用して新しいOwinContext
を作成できます。