سؤال

أرغب في الحصول على موقع ASP.NET خفيف الوزن للغاية يشمل إزالة أكبر عدد ممكن من أجهزة HttpModules المعتادة وحالة جلسة تعطيل ممكنة. ومع ذلك، عندما أحاول القيام بذلك، أحصل على الخطأ التالي:

The SessionStateTempDataProvider requires SessionState to be enabled.

لقد تعطيل حالة جلسة معطلة في Web.config:

<sessionState mode="Off" />

أنا أفهم أن ASP.NET MVC يستخدم حالة الجلسة ل Tempdata، لكنني لا أحتاج / تريد Tempdata - أريد فقط تعطيل حالة الجلسة. مساعدة!

هل كانت مفيدة؟

المحلول

يمكنك جعل تحكم الخاص بك و 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)
  {
  }
}

ثم تحتاج فقط إلى تسجيل مصنع Controller في بدء تشغيل التطبيق - على سبيل المثال، يمكنك القيام بذلك في Global.asax:

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

نصائح أخرى

لقد وجدت طريقة واحدة، والتي لا أهتم بها بشكل خاص:

إنشاء 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();
    }
}

أفضل بكثير طريقة للقيام بذلك تماما عبر التكوين، ولكن هذا يعمل الآن.

إذا كنت بحاجة إلى استخدام Tempdata للحصول على سلاسل بسيطة، فيمكنك استخدام cookietempdataprovider في mvcfutures http://aspnet.codeplex.com/release/projectreleases.aspx؟rreleaseid=24471..

وفقا لبراد ويلسون، تم إصلاح هذا في المعاينة MVC 2 1. انظر هنا و هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top