私はいくつかの WebForms/MVC に依存しないツールを使用しHttpContext
ており、オブジェクトへの参照を指定してインスタンスを取得する必要がありHttpContextBase
ます。HttpContext.Current
これは非同期でも動作する必要があるため、使用できません(非同期リクエスト中にHttpContext.Current
戻ります)。null
私は知ってHttpContextWrapper
いますが、間違った方向に進んでいます。
3 に答える
最も簡単な方法は、アプリケーションを取得し、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
オーバーライド。の実装により、、などの通常の容疑者を照会できます。Contextというプロパティがあり、のインスタンスを返すのはまさにそのためです。したがって、 viaを要求し、返されたインスタンスのプロパティを読み取ることで、ラップされたインスタンスに到達します。HttpContextWrapper
GetService
HttpContext
GetService
HttpContext
HttpApplication
HttpRequest
HttpResponse
HttpApplication
HttpContext
HttpContext
HttpContextBase
HttpApplication
GetService
Context
HttpApplication
とは異なりHttpContextBase
、GetService
のパブリックメンバーとしては表示されませんがHttpContext
、それはHttpContext
実装がIServiceProvider.GetService
明示的に実装されてHttpContextBase
いないためです。
Foo
これは、テスト中に基になるものをアンラップできることに依存しておりHttpContext
、そもそも偽造/スタブすることはほぼ不可能であるため、テストできなくなったことを覚えておいてください。ただし、この回答のポイントは、文字通り、「HttpContextBaseからHttpContextオブジェクトを取得するにはどうすればよいですか?」という質問に対処することです。図解された手法は、必ずしも変更する余裕がないコンポーネントに挟まれている場合に役立ちます。
あなたはできる、
var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);
できません。
の全体的な目的は、具象クラスHttpContextBase
への依存を抽象化することです。具象( の場合など)がHttpContext
含まれる場合がありますが、他の実装は とはまったく関係がない場合があります。HttpContext
httpContextWrapper
HttpContext
HttpContextBase
常に具象HttpContext
を でラップできるため、 を取得できるカスタムの抽象ファクトリを定義するのが最善の方法ですHttpContextWrapper
。