代码之家  ›  专栏  ›  技术社区  ›  Matt Sherman

在ASP中禁用每个请求的会话状态。Net MVC

  •  51
  • Matt Sherman  · 技术社区  · 16 年前

    我正在ASP中创建一个ActionResult。Net MVC提供图像服务。启用会话状态后,IIS一次只能处理来自同一用户的一个请求。(这不仅适用于MVC。)

    因此,在一个有多个图像调用此操作的页面上,一次只能处理一个图像请求。它是同步的。

    9 回复  |  直到 16 年前
        1
  •  35
  •   Dbl    11 年前
        2
  •  53
  •   Community Mohan Dere    8 年前

    RouteHandler

    事情是这样的- IRouteHandler GetHttpHandler MvcRouteHandler ,返回一个 MvcHandler . MVC处理程序 IHttpHandler 这标有(惊喜!) IRequiresSessionState

    如果 you follow my blog post .

        3
  •  6
  •   Chuck Conway    16 年前

    https://techatfingers.wordpress.com/2016/06/14/session-state-on-action/

    public sealed class ActionSessionStateAttribute : Attribute
        {
                public SessionStateBehavior SessionBehavior { get; private set; }          
                public ActionSessionStateAttribute(SessionStateBehavior sessionBehavior)
                {
                    SessionBehavior = sessioBehavior;
                }
        }
    

    public class SessionControllerFactory : DefaultControllerFactory
    {       
            protected override SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, Type controllerType)
            {
                if (controllerType == null)
                    return SessionStateBehavior.Default;
    
                var actionName = requestContext.RouteData.Values["action"].ToString();
                Type typeOfRequest=requestContext.HttpContext.Request.RequestType.ToLower() =="get"?typeof(HttpGetAttribute):typeof(HttpPostAttribute);
                // [Line1]
                var cntMethods = controllerType.GetMethods()
                       .Where(m => 
                        m.Name == actionName &&
                        (  (  typeOfRequest == typeof(HttpPostAttribute) && 
                              m.CustomAttributes.Where(a => a.AttributeType == typeOfRequest).Count()>0
                           )
                           ||
                           (  typeOfRequest == typeof(HttpGetAttribute) &&
                              m.CustomAttributes.Where(a => a.AttributeType == typeof(HttpPostAttribute)).Count() == 0
                           )
                        )
                    );
                MethodInfo actionMethodInfo = actionMethodInfo = cntMethods != null && cntMethods.Count() == 1 ? cntMethods.ElementAt(0):null;
                if (actionMethodInfo != null)
                {
                    var sessionStateAttr = actionMethodInfo.GetCustomAttributes(typeof(ActionSessionStateAttribute), false)
                                        .OfType<ActionSessionStateAttribute>()
                                        .FirstOrDefault();
    
                    if (sessionStateAttr != null)
                    {
                        return sessionStateAttr.Behavior;
                    }
                }
                return base.GetControllerSessionBehavior(requestContext, controllerType);
     }
    

    public class MvcApplication : System.Web.HttpApplication
     {
            protected void Application_Start()
            {
                // --- other code ---
                ControllerBuilder.Current.SetControllerFactory(typeof(SessionControllerFactory));
            }
    }
    
        4
  •  6
  •   SeeTheC    8 年前

    这将为您提供两个好处:一是会话由cookie跟踪,因此images.mysite.com不会有cookie。第二,它将为您提供另外两个并发请求来检索图像。

        5
  •  4
  •   Serdar    14 年前

    这个想法是告诉asp.net,特定的请求不会使用会话对象。

    因此,为特定请求创建自定义路由处理程序

    public class CustomRouteHandler : IRouteHandler
        {
            public System.Web.IHttpHandler GetHttpHandler(RequestContext requestContext)
            {
                requestContext.HttpContext.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.ReadOnly);
                return new MvcHandler(requestContext);
            }
        }
    

    SessionStateBehavior枚举有4个成员,您应该使用“禁用”或“只读”模式来获取异步行为。

    routes.Add("Default", new Route(
                    "{controller}/{action}",
                   new RouteValueDictionary(new { controller = "Home", action = "Index"}),
                   new CustomRouteHandler()
                    ));
    

        6
  •  3
  •   takepara    16 年前

    将DefaultCOntrollerFactory更改为自定义ControllerFactory类。默认控制器。TempDataProvider使用SessionStateTempDataSource。你可以改变它。

    2.创建DictionaryTempDataProvider类。

      public class DictionaryTempDataProvider : ITempDataProvider
      {
        public IDictionary<string, object> LoadTempData(ControllerContext controllerContext)
        {
          return new Dictionary<string, object>();
        }
    
        public void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values)
        {
        }
      }
    

      public class DictionaryTempDataControllerFactory : DefaultControllerFactory
      {
        public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
        {
          var controller = base.CreateController(requestContext, controllerName) as Controller;
          if (controller!=null)
            controller.TempDataProvider = new DictionaryTempDataProvider();
    
          return controller;
        }
      }
    

    protected void Application_Start()
    {
      RegisterRoutes(RouteTable.Routes);
    
      ControllerBuilder.Current.SetControllerFactory(
       new DictionaryTempDataControllerFactory()
      );
    }
    
        7
  •  1
  •   orip    16 年前

        8
  •  0
  •   Diemar    12 年前

    将您希望禁用seesion的代码重构到该控制器

    推荐文章