私はいくつかのWebForms/MVCに依存しないツールを使用しており、HttpContext
オブジェクトへの参照を指定してHttpContextBase
のインスタンスを取得する必要があります。使用できませんHttpContext.Current
これは非同期で動作するためにも必要だからです(HttpContext.Current
は、非同期リクエスト中にnull
を返します)。私はHttpContextWrapper
を知っていますが、間違った方向に進みます。
最も簡単な方法は、アプリケーション ApplicationInstance
を取得し、その Context
プロパティを使用することです。
// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;
( Ishmael Smyrnow に感謝します)
特に、渡されたHttpContextBase
インスタンスのタイプが HttpContextWrapper
である場合、実行時にできます。次の例は、これを行う方法を示しています。コンテキストをFoo
として受け入れるHttpContextBase
と呼ばれるメソッドがあるが、サードパーティアセンブリ(変更する幸運がないかもしれない)のメソッドを呼び出す必要があると仮定します。 HttpContext
として入力されるコンテキスト。
void Foo(HttpContextBase context)
{
var app = (HttpApplication) context.GetService(typeof(HttpApplication));
ThirdParty.Bar.Baz(app.Context);
}
// Somewhere in Assembly and namespace ThirdParty,
// in a class called Bar, there is Baz expecting HttpContext:
static void Baz(HttpContext context) { /* ... */ }
HttpContextBase
には、 GetService
のサポートの結果として IServiceProvider
というメソッドがあります。 GetService
のHttpContextWrapper
オーバーライドは、ラップされたGetService
インスタンスのHttpContext
実装に委任します。 GetService
のHttpContext
実装により、HttpApplication
、HttpRequest
、HttpResponse
などの通常の容疑者を照会できます。 HttpApplication
に Context と呼ばれるプロパティがあり、HttpContext
のインスタンスを返すことがあります。したがって、ラップされたHttpContext
インスタンスを取得するには、HttpContextBase
をHttpApplication
にGetService
経由で要求し、続いて返されたContext
インスタンスのHttpApplication
プロパティを読み取ります。 。
HttpContextBase
とは異なり、GetService
はHttpContext
のパブリックメンバーとして表示されませんが、それはHttpContext
がIServiceProvider.GetService
明示的にHttpContextBase
はそうではありません。
Foo
は、テスト中に基礎となるHttpContext
をアンラップできることに依存しており、そもそも偽造/スタブが不可能に近いため、もはやテスト可能ではないことに留意してください。ただし、この答えのポイントは、「HttpContextBaseからHttpContextオブジェクトを取得する方法は?」、literallyという質問に対処することです。図に示した手法は、必ずしも変更する余裕がないコンポーネントの間に挟まれているような状況で役立ちます。
あなたはできる、
var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);
できません。
HttpContextBase
の目的は、具体的なHttpContext
クラスへの依存関係を抽象化することです。 may具象HttpContext
(httpContextWrapper
の場合などが含まれていますが、他の実装ではまったく関係ない場合がありますHttpContext
。
HttpContextBase
で具体的なHttpContext
をいつでもラップできるので、最適なオプションはHttpContextWrapper
を取得できるカスタム抽象ファクトリを定義することです。