コントローラーのインスタンスのHttpContextは、ASP.net MVCでnullです
-
03-07-2019 - |
質問
これはコントローラーを使用する正しい方法ではないかもしれませんが、この問題に気づき、修正する方法を見つけていませんでした。
public JsonResult SomeControllerAction() {
//The current method has the HttpContext just fine
bool currentIsNotNull = (this.HttpContext == null); //which is false
//creating a new instance of another controller
SomeOtherController controller = new SomeOtherController();
bool isNull = (controller.HttpContext == null); // which is true
//The actual HttpContext is fine in both
bool notNull = (System.Web.HttpContext.Current == null); // which is false
}
コントローラーのHttpContextが「実際の」ものではないことに気付きました。 System.Web.HttpContext.CurrentにあるHttpContext。
コントローラーのHttpContextBaseを手動で設定する方法はありますか?または、コントローラーのインスタンスを作成するより良い方法はありますか?
解決
コントローラーは、あなたがやっているように手動で作成されるようには設計されていません。本当にすべきなのは、再利用可能なロジックをヘルパークラスに入れることです。
他のヒント
ここでは、次のことを行います。これは許容可能な修正方法のようです...
public new HttpContextBase HttpContext {
get {
HttpContextWrapper context =
new HttpContextWrapper(System.Web.HttpContext.Current);
return (HttpContextBase)context;
}
}
これがこれらのControllerが継承しているControllerクラスに追加される場所。
HttpContextがnullであることが望ましい動作であるかどうかはわかりませんが、それは私のためにそれを修正します。
ControllerContextのHttpContextは、コントローラーの作成時に設定されないため、nullです。コントローラーのコンストラクターはこのプロパティを割り当てないため、nullになります。通常、HttpContextはControllerBuilderクラスのHttpContextに設定されます。コントローラーはControllerBuilderクラスによって作成され、その後にDefaultControllerFactoryが続きます。コントローラーの独自のインスタンスを作成する場合は、独自のControllerContextでコントローラーのExecuteMethodを使用できます。それをしたくないのは、実際のアプリケーションです。フレームワークでさらに経験を積むと、必要な適切な方法が見つかります。 UnitContextでControllerContextが必要な場合、モックフレームワークを使用してControllerContextをモックするか、クラスを偽装することができます。
Asp.net mvcを初めて使用する場合は、ソースコードをダウンロードし、リクエストの処理方法のトレースを読むのに価値があります。
コントローラーの一部の機能を使用したいですか?または、コントローラーがアクションを実行しましたか?
前者の場合は、別のクラスに分割する必要があるコードである可能性があります。後者の場合、これを行うことで、そのコントローラーに特定のアクションを実行させることができます。
return RedirectToAction("SomeAction", "SomeOtherController", new {param1 = "Something" });
コントローラー工場を使用していますか?その場合、コンポーネントをどのように登録しますか?
WindsorのTransientではなく、SingleContextとしてHttpContextベースの依存関係を誤って追加したこの問題に遭遇しました。
HttpContextは、最初のリクエスト以外はすべてnullでした。その追跡に時間がかかりました。