Wie kann ich den Sitzungsstatus in ASP.NET MVC deaktivieren?

77

Ich hätte gerne eine sehr leichte ASP.NET MVC-Site, die das Entfernen möglichst vieler üblicher HttpModules und das Deaktivieren des Sitzungsstatus umfasst. Wenn ich dies jedoch versuche, wird folgende Fehlermeldung angezeigt:

The SessionStateTempDataProvider requires SessionState to be enabled.

Ich habe den Sitzungsstatus in web.config deaktiviert:

<sessionState mode="Off" />

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

Daniel Schaffer
quelle
Gute Idee - Ich würde mich freuen zu hören, ob Sie auf andere Probleme gestoßen sind und wie leicht Sie am Ende werden konnten.
Michael Hart
Nachdem ich Steves Änderungen implementiert hatte, habe ich nicht mehr viel experimentiert, aber es gab immer noch einiges an Overhead. Das schnellste, was ich in der Lage war, ASP.NET zum Laufen zu bringen, waren reine IHttpHandler-Implementierungen. Siehe meine Antwort hier für weitere Informationen: stackoverflow.com/questions/509978/…
Daniel Schaffer
26
Dies wurde in MVC 2 behoben. Wir haben den temporären Datenprovider für den Sitzungsstatus behoben, den er nur dann auslöst, wenn Sie tatsächlich versuchen, die temporären Daten zu lesen / schreiben.
Brad Wilson
Brad: Ausgezeichnet, gut zu wissen!
Daniel Schaffer

Antworten:

48

Sie können Ihre eigene ControllerFactory und DummyTempDataProvider erstellen. Etwas wie das:

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-Factory beim Start der App registrieren - z. B. könnten Sie dies in global.asax tun:

ControllerBuilder.Current.SetControllerFactory(new NoSessionControllerFactory());
Steve Willcock
quelle
1
Danke ... immer noch nicht ideal (zumindest für mich), aber immer noch besser als auf jedem Controller.
Daniel Schaffer
10
Entschuldigung, das klang wirklich undankbar ... bedeutete nicht, dass es war: D
Daniel Schaffer
3
hehe, kein Problem :) Ich verstehe, es könnte mehr Code sein, als Sie sich idealerweise wünschen würden, denn es scheint eine konfigurierbare Sache zu sein, aber eine der großen Stärken von ASP.NET MVC ist diese Art der Konfiguration durch die Bereitstellung von Alternativen Implementierungen per Code. Es gibt dir viel Kraft, um hineinzukommen und die Dinge so zu machen, wie du willst, und insgesamt würde ich sagen, dass es wirklich eine „gute Sache“ ist. Persönlich gebe ich sowieso lieber C # -Code als XML ein;)
Steve Willcock
Hallo Steve. Ich habe gerade Ihren Code in mein Projekt implementiert. Es funktioniert gut. Vielen Dank! Jetzt habe ich Sitzung deaktiviert.
Cyril Gupta
4
Ich habe meiner Lösung in der SaveTempData-Methode ein weiteres Element hinzugefügt: if (values.Count! = 0) löst eine neue NotImplementedException aus ("Tempdata können nicht festgelegt werden, kein Sitzungsstatus verfügbar"); tinyurl.com/mbegfr
BillRob
9

Ich habe einen Weg gefunden, den ich nicht besonders mag:

Erstellen Sie 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
    }
}

Überschreiben Sie den Provider im Controller manuell

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

Ich würde es sehr bevorzugen, dies vollständig über die Konfiguration zu tun, aber dies funktioniert vorerst.

Daniel Schaffer
quelle
4
Ja, Ihr Weg ähnelt dem, den ich in meiner Antwort beschrieben habe - obwohl Sie den TempDataProvider nicht in jedem Controller manuell überschreiben müssen, wenn Sie eine benutzerdefinierte ControllerFactory bereitstellen, die dies für Sie erledigt.
Steve Willcock
5
Sie können auch eine Basis-Controller-Klasse erstellen und den TempDataProvider in seinem Konstruktor konfigurieren.
Brannon
1

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

Raleigh Buckner
quelle
0

Moderne Lösung:

Wenn Sie in ASP.NET das Sitzungsobjekt nicht zum Speichern von Daten verwenden oder wenn eines der Sitzungsereignisse (Session_OnStart oder Session_OnEnd) behandelt wird, ist der Sitzungsstatus deaktiviert.

Wenn Sie also keine Sitzung (oder TempData) verwenden, wird der Sitzungsstatus deaktiviert.

Quelle

ErTR
quelle