159

私はいくつかの WebForms/MVC に依存しないツールを使用しHttpContextており、オブジェクトへの参照を指定してインスタンスを取得する必要がありHttpContextBaseます。HttpContext.Currentこれは非同期でも動作する必要があるため、使用できません(非同期リクエスト中にHttpContext.Current戻ります)。null私は知ってHttpContextWrapperいますが、間違った方向に進んでいます。

4

3 に答える 3

254

最も簡単な方法は、アプリケーションを取得し、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) { /* ... */ }

HttpContextBaseGetServiceサポートの結果として呼び出されるメソッドがありIServiceProviderます。ラップされたインスタンスの実装へのデリゲートのGetServiceオーバーライド。の実装により、、などの通常の容疑者を照会できます。Contextというプロパティがあり、のインスタンスを返すのはまさにそのためです。したがって、 viaを要求し、返されたインスタンスのプロパティを読み取ることで、ラップされたインスタンスに到達します。HttpContextWrapperGetServiceHttpContextGetServiceHttpContextHttpApplicationHttpRequestHttpResponseHttpApplicationHttpContextHttpContextHttpContextBaseHttpApplicationGetServiceContextHttpApplication

とは異なりHttpContextBaseGetServiceのパブリックメンバーとしては表示されませんがHttpContext、それはHttpContext実装がIServiceProvider.GetService明示的に実装されてHttpContextBaseいないためです。

Fooこれは、テスト中に基になるものをアンラップできることに依存しておりHttpContext、そもそも偽造/スタブすることはほぼ不可能であるため、テストできなくなったことを覚えておいてください。ただし、この回答のポイントは、文字通り、「HttpContextBaseからHttpContextオブジェクトを取得するにはどうすればよいですか?」という質問に対処することです。図解された手法は、必ずしも変更する余裕がないコンポーネントに挟まれている場合に役立ちます。

于 2010-12-31T02:34:36.053 に答える
33

あなたはできる、

var abstractContext = new System.Web.HttpContextWrapper(System.Web.HttpContext.Current);
于 2010-08-12T21:07:10.017 に答える
14

できません。

の全体的な目的は、具象クラスHttpContextBaseへの依存を抽象化することです。具象( の場合など)HttpContext含まれる場合がありますが、他の実装は とはまったく関係がない場合があります。HttpContext httpContextWrapperHttpContext

HttpContextBase常に具象HttpContextを でラップできるため、 を取得できるカスタムの抽象ファクトリを定義するのが最善の方法ですHttpContextWrapper

于 2010-01-02T17:30:12.477 に答える