Pertanyaan Bagaimana saya bisa menonaktifkan sesi negara dalam ASP.NET MVC?


Saya ingin memiliki situs ASP.NET MVC yang sangat ringan yang termasuk menghapus sebanyak mungkin HttpModules yang biasa dan menonaktifkan keadaan sesi. Namun ketika saya mencoba melakukan ini, saya mendapatkan kesalahan berikut:

The SessionStateTempDataProvider requires SessionState to be enabled.

Saya telah menonaktifkan status sesi di web.config:

<sessionState mode="Off" />

Saya mengerti bahwa ASP.NET MVC menggunakan status sesi untuk TempData, tetapi saya tidak perlu / menginginkan TempData - saya hanya ingin menonaktifkan status sesi. Membantu!


75
2018-05-19 20:28


asal


Jawaban:


Anda bisa membuat ControllerFactory dan DummyTempDataProvider Anda sendiri. Sesuatu seperti ini:

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

Dan kemudian Anda hanya perlu mendaftarkan pabrik pengontrol pada startup aplikasi - mis. Anda dapat melakukan ini di global.asax:

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

47
2018-05-19 20:40



Saya telah menemukan satu cara, yang tidak begitu saya pedulikan:

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

Timpa Penyedia secara Manual di Kontroler

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

Saya akan lebih memilih cara untuk melakukan ini sepenuhnya melalui konfigurasi, tetapi ini berfungsi untuk saat ini.


9
2018-05-19 20:37



Jika Anda perlu menggunakan TempData untuk string sederhana, Anda dapat menggunakan CookieTempDataProvider di MvcFutures http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24471.


6
2017-08-28 15:40



Menurut Brad Wilson, ini telah diperbaiki dalam MVC 2 Preview 1. Lihat sini dan sini.


1
2017-08-28 23:44