2009-05-19 34 views
75

我想要一個非常輕量級的ASP.NET MVC網站,其中包括儘可能多的刪除通常的HttpModules並禁用會話狀態。然而,當我嘗試這樣做,我得到以下錯誤:如何禁用ASP.NET MVC中的會話狀態?

The SessionStateTempDataProvider requires SessionState to be enabled.

我在web.config中禁用會話狀態:

<sessionState mode="Off" /> 

據我所知,ASP.NET MVC使用會話狀態爲TempData,但我不需要/需要TempData - 我只想禁用會話狀態。幫幫我!

+0

不錯的主意 - 我很想聽聽你是否遇到過任何其他問題,以及你最終能夠獲得多少輕量級。 – 2009-08-28 12:00:29

+0

在實施Steve的變更後,我沒有做更多的實驗,但仍有相當多的開銷。我已經能夠最快地獲得ASP.NET的最快版本是使用直接的IHttpHandler實現。查看我的答案在這裏獲取更多信息:http://stackoverflow.com/questions/509978/something-faster-than-httphandlers/510001#510001 – 2009-08-28 15:01:15

+26

這是固定在MVC 2中。我們修復了它贏得的會話狀態臨時數據提供者除非實際嘗試讀取/寫入臨時數據,否則不會拋出。 – 2009-08-28 16:40:43

回答

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()); 
9

我找到了一個辦法,我並不特別關心:

創建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(); 
    } 
} 

我會非常喜歡通過配置完全做到這一點的方式,但現在這個工作。

1

根據Brad Wilson的說法,這已在MVC 2 Preview 1中修復。請參閱herehere