2009-05-19 22 views
75

できるだけ多くの通常のHttpModulesを削除し、セッション状態を無効にする、非常に軽量のASP.NET MVCサイトを用意したいと思います。私はこれをしようとする場合しかし、私は次のエラーを取得する:ASP.NET MVCでセッション状態を無効にするにはどうすればよいですか?

The SessionStateTempDataProvider requires SessionState to be enabled.

私はweb.configファイルに無効なセッション状態をしました:

<sessionState mode="Off" /> 

私はASP.NET MVCは、セッションを使用していることを理解してTempDataの状態ですが、私はTempDataを必要としません。セッション状態を無効にしたいだけです。助けて!

+0

いいアイデア - これについて他の問題が発生した場合や、最終的にどのように軽量化できたかについて聞いてみたいと思います。 –

+0

スティーブの変更を実装した後、私はもっと実験をしませんでしたが、かなりのオーバーヘッドがありました。最も速いのは、IHttpHandlerの実装で、ASP.NETが動作するようになったことです。詳細は私の答えを見てください:http://stackoverflow.com/questions/509978/something-faster-than-httphandlers/510001#510001 –

+26

これはMVC 2で修正されています。あなたが実際に一時データを読み書きしようとしない限り投げません。 –

答えて

47

独自の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

おかげさま...まだ(少なくとも私にとって)理想的ではありませんが、各コントローラーでそれをやっているよりも優れています。 –

+10

申し訳ありませんが、それは本当に恩知らずに聞こえました... D –

+2

hehe、問題ありません:)私はあなたが理想的には設定可能なものでなければならないように思われるよりも多くのコードのように思えるかもしれないと理解していますしかし、ASP.NET MVCの大きな強みの1つは、コードによる代替実装を提供するこのタイプの構成です。それは、あなたがそこに入り、あなたが望むように物事を行うために多くの力を与え、私はそれが本当に「良いこと」だと言っています。個人的に私はとにかくxmlよりもC#コードを入力することをお勧めします;) –

9

私は特にために気にしない一つの方法、見つけた:

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(); 
    } 
} 
でプロバイダを上書きNoTempDataProvider作成

私はこの設定を完全に行う方法を非常に好むでしょうが、しかしこれは今のところうまくいく。

+3

はい、あなたの方法は私の答えで概説したのと似ていますが、カスタムControllerFactoryを提供してそれを処理する場合、各コントローラのTempDataProviderを手動でオーバーライドする必要はありません。 –

+4

基本Controllerクラスを作成し、そのコンストラクターにTempDataProviderを構成することもできます。 – Brannon

1

Brad Wilsonによると、これはMVC 2プレビュー1で修正されています。herehereを参照してください。