シングルトンパターンを使用する独自のApplicationContextクラスを実装しています。リクエストのすべての部分でアクセスできるため、インスタンスをHttpContext.Itemsに保存したいと思います。ASP.NET MVCでのHttpContextの使用について読んでいますが、大きな問題の1つは、テストが複雑になることです。HttpContext.Itemsのテスト容易性について調査してみましたが、見つけることができるのはSessionに関するものだけです。私が見つけた唯一のものの1つは、Wroxに関するProfessional ASP.NET 3.5 MVCブックのサンプルの章からのものです(pdfリンクはこちら)。15ページには次のように書かれています。
使用できないもの:HttpContext.Items
上記のセクションで、私たちはきれいになり、嘘をついたことを伝えました。HttpContextはASP.NETMVCとASP.NETWebフォームの間で共有されていません。この結果、HttpContext.Itemsコレクションを使用してデータのビットを格納および取得することはできません。
これは、コントローラーにリダイレクトすると、HttpHandlerがSystem.Web.Mvc.MvcHandlerになるためです。これは、HttpContextWrapperを使用して作成され、独自のHttpContext.Currentの定義があります。残念ながら、このハンドシェイク中は、HttpContext.Itemsなどは転送されません。
つまり、HttpContextの型は、見た目も音もほとんど同じですが、同じではなく、この方法でデータを渡すことはできません。
今、私はこれをテストしようとしました、そして私が知る限り、RedirectToActionを使用して別のコントローラーにリダイレクトする場合、HttpContext.Itemsは残ります。これをテストするために、デフォルトのASP.NETMVCプロジェクトを使用しています。私がやったことは、このメソッドをGlobal.asax.csに追加することです。
protected void Application_BeginRequest()
{
Context.Items["Test"] = "Hello World";
}
また、HomeController.csで、Indexメソッドを次のように変更しました。
public ActionResult Index()
{
return RedirectToAction("About");
}
そして、Aboutメソッドを次のように変更しました。
public ActionResult About()
{
Response.Write(Convert.ToString(HttpContext.Items["Test"]));
return View();
}
アプリケーションを実行すると、ページは/ Home/AboutとResponseに正しくリダイレクトされます。global.asax.csに設定されている正しい「HelloWorld」文字列を書き込みます。
そのため、「HttpContext.Itemsのようなものは転送されない」と書かれている場合、本の意味がわからないように見えます。または、このようなものは転送され、HttpContext.Itemsを使用しても問題ありません。
HttpContext.Itemsを避けることをお勧めする場合、リクエストごとにオブジェクトをリクエスト全体に保存する別の方法はありますか?