できるだけ多くの通常のHttpModulesを削除し、セッション状態を無効にすることを含む、非常に軽量なASP.NET MVCサイトを作成したいと思います。ただし、これを実行しようとすると、次のエラーが表示されます。
The SessionStateTempDataProvider requires SessionState to be enabled.
Web.configでセッション状態を無効にしました:
<sessionState mode="Off" />
ASP.NET MVCはTempDataにセッション状態を使用することを理解していますが、TempDataを必要としない/必要としない-セッション状態を無効にしたいだけです。助けて!
独自のControllerFactoryとDummyTempDataProviderを作成できます。このようなもの:
public class NoSessionControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)
{
var controller = base.GetControllerInstance(controllerType);
((Controller) controller).TempDataProvider = new DummyTempDataProvider();
return controller;
}
}
public class DummyTempDataProvider : ITempDataProvider
{
public IDictionary<string, object> LoadTempData(ControllerContext controllerContext)
{
return new Dictionary<string, object>();
}
public void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values)
{
}
}
そして、アプリの起動時にコントローラーファクトリーを登録するだけです-例えばglobal.asaxでこれを行うことができます。
ControllerBuilder.Current.SetControllerFactory(new NoSessionControllerFactory());
私は特に気にしない1つの方法を見つけました。
NoTempDataProviderの作成
using System;
using System.Collections.Generic;
using System.Web.Mvc;
namespace Facebook.Sites.Desktop.Auth.Models
{
public class NoTempDataProvider : ITempDataProvider
{
#region [ ITempDataProvider Members ]
public IDictionary<String, Object> LoadTempData(ControllerContext controllerContext)
{
return new Dictionary<String, Object>();
}
public void SaveTempData(ControllerContext controllerContext, IDictionary<String, Object> values) { }
#endregion
}
}
コントローラーでプロバイダーを手動で上書きする
public class AuthController : Controller
{
public AuthController()
{
this.TempDataProvider = new NoTempDataProvider();
}
}
私は設定を介してこれを完全に行う方法を非常に好みますが、これは今のところ機能します。
単純な文字列にTempDataを使用する必要がある場合は、MvcFuturesでCookieTempDataProviderを使用できます http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471 。