Wie kann ich den Sitzungsstatus in ASP.NET MVC zu deaktivieren?
-
23-08-2019 - |
Frage
Ich möchte eine sehr leichte ASP.NET MVC-Website haben, die so viele der üblichen Httpmodules wie möglich und Deaktivieren von Sitzungsstatus umfasst das Entfernen. Allerdings, wenn ich versuche, dies zu tun, ich die folgende Fehlermeldung erhalten:
The SessionStateTempDataProvider requires SessionState to be enabled.
Ich habe deaktiviert Sitzungszustand in web.config:
<sessionState mode="Off" />
Ich verstehe, dass ASP.NET MVC Sitzungsstatus für TempData verwendet, aber ich brauche nicht / will TempData - Ich will nur den Sitzungszustand deaktivieren. Hilfe!
Lösung
Sie können Ihren eigenen Controller und DummyTempDataProvider machen. So etwas wie folgt aus:
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 würden Sie müssen nur die Controller Factory auf App Startup registrieren - zum Beispiel Sie könnte dies in global.asax tun:
ControllerBuilder.Current.SetControllerFactory(new NoSessionControllerFactory());
Andere Tipps
Ich habe einen Weg gefunden, die ich vor allem ist es egal, für:
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
}
}
Überschreiben Sie manuell die Provider im Controller
public class AuthController : Controller
{
public AuthController()
{
this.TempDataProvider = new NoTempDataProvider();
}
}
Ich würde sehr eine Art und Weise bevorzugen diese vollständig über die Konfiguration zu tun, aber das funktioniert jetzt.
Wenn Sie TempData für einfache Strings verwenden müssen, können Sie die CookieTempDataProvider in MvcFutures verwenden http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471 .