2009-05-19 13 views
75

Ich möchte eine sehr leichte ASP.NET MVC-Site haben, die das Entfernen so vieler gängiger HttpModule wie möglich und das Deaktivieren des Sitzungsstatus beinhaltet. Allerdings, wenn ich versuche, dies zu tun, ich die folgende Fehlermeldung erhalten:Wie kann ich den Sitzungsstatus in ASP.NET MVC deaktivieren?

The SessionStateTempDataProvider requires SessionState to be enabled.

Ich habe deaktiviert Sitzungszustand in web.config:

<sessionState mode="Off" /> 

Ich verstehe, dass ASP.NET MVC verwendet Session State für TempData, aber ich brauche/will nicht TempData - Ich möchte nur den Sitzungsstatus deaktivieren. Hilfe!

+0

Schöne Idee - Ich würde mich freuen zu hören, wenn Sie irgendwelche anderen Probleme mit diesem und wie leicht Sie am Ende bekommen konnten. –

+0

Ich habe nicht viel mehr experimentiert, nachdem ich Steves Änderungen implementiert hatte, aber es gab immer noch eine Menge Overhead. Das schnellste, das ich ASP.NET in Gang bringen konnte, war mit direkten IHttpHandler-Implementierungen. Siehe meine Antwort hier für weitere Informationen: http://stackoverflow.com/questions/509978/something-faster-than-httphandlers/510001#510001 –

+26

Dies ist in MVC 2 behoben. Wir repariert den Sitzungszustand Temp Data Provider, die es gewonnen hat Werde nicht versuchen, die Temp-Daten zu lesen/schreiben. –

Antwort

47

Sie könnten Ihre eigene ControllerFactory und DummyTempDataProvider machen. Etwas wie dieses:

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) 
    { 
    } 
} 

Und dann müssten Sie nur die Controller-Fabrik beim App-Start registrieren - z. Sie könnte dies in global.asax tun:

ControllerBuilder.Current.SetControllerFactory(new NoSessionControllerFactory()); 
+1

Danke ... immer noch nicht ideal (zumindest für mich), aber immer noch besser als bei jedem Controller. –

+10

Entschuldigung, das klang wirklich undankbar ... wollte es nicht heißen: D –

+2

hehe, kein Problem :) Ich verstehe, dass es mehr Code zu sein scheint, als du im Idealfall für etwas haben möchtest, das wie eine konfigurierbare Sache aussieht , aber eine der großen Stärken von ASP.NET MVC ist diese Art der Konfiguration durch die Bereitstellung alternativer Implementierungen über Code.Es gibt Ihnen eine Menge Kraft, um dort hinein zu kommen und die Dinge so zu machen, wie Sie es wollen, und insgesamt würde ich sagen, es ist wirklich eine "gute Sache". Persönlich bevorzuge ich C# -Code als XML trotzdem;) –

9

Ich habe einen Weg gefunden, die ich vor allem für nicht kümmern:

erstellen 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 
    } 
} 

manuell die Provider überschreiben im Controller

public class AuthController : Controller 
{ 
    public AuthController() 
    { 
     this.TempDataProvider = new NoTempDataProvider(); 
    } 
} 

Ich würde einen Weg bevorzugen, dies komplett über die Konfiguration zu tun, aber das funktioniert jetzt.

+3

Ja, Ihr Weg ist ähnlich wie ich es in meiner Antwort beschrieben habe - obwohl Sie den TempDataProvider in keinem Controller manuell überschreiben müssen, wenn Sie eine benutzerdefinierte ControllerFactory zur Verfügung stellen, die es für Sie behandelt. –

+4

Sie können auch eine Basis-Controller-Klasse erstellen und den TempDataProvider im Konstruktor konfigurieren. – Brannon

1

Laut Brad Wilson wurde dies in MVC 2 Preview 1 behoben. Siehe here und here.

Verwandte Themen