1. ホーム
  2. asp.net-mvc

[解決済み] ASP.NET MVC 1でHttpContextBaseからHttpContextオブジェクトを取得するにはどうすればよいですか?

2022-04-29 01:02:47

質問内容

私はいくつかのWebForms/MVC-agnosticツールで作業しています。 HttpContext への参照が与えられると HttpContextBase オブジェクトを作成します。を使うことはできません。 HttpContext.Current なぜなら、これは非同期にも動作させる必要があるからです( HttpContext.Current を返します。 null 非同期リクエストの間)。私が知っているのは HttpContextWrapper が、間違った方向に進んでしまう。

解決方法は?

一番簡単な方法は、アプリケーションを入手することです。 ApplicationInstance を使用し、その Context プロパティを使用します。

// httpContextBase is of type HttpContextBase
HttpContext context = httpContextBase.ApplicationInstance.Context;

<サブ (おかげさまで イシュマエル・スミルナウ コメントでご指摘いただきました)

オリジナルの回答です。

できます、特に 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 というプロパティがあります。 コンテキスト のインスタンスを返します。 HttpContext . つまり、ラップされた HttpContext のインスタンスを作成します。 HttpContextBase に対して HttpApplication を介して GetService の読み込みに続いて Context プロパティが返されます。 HttpApplication インスタンスを作成します。

とは異なり HttpContextBase , GetService のパブリックメンバとして表示されません。 HttpContext が、それは HttpContext が実装されています。 IServiceProvider.GetService を明示しながら HttpContextBase がない。

を念頭に置いてください。 Foo をアンラップできることに依存しているので、もはやテスト可能ではありません。 HttpContext テスト中にフェイクやスタブを作ることは不可能に近いです。しかし、この回答のポイントは、「HttpContextBaseからHttpContextオブジェクトを取得するにはどうすればよいか」という質問に答えることです。 文字通り . このテクニックは、必ずしも修正する余裕がないコンポーネントに挟まれたような場合に有効です。