Deshabilitar el estado de la sesión por solicitud en ASP.Net MVC


Estoy creando un ActionResult en ASP.Net MVC para servir imágenes. Con el estado de sesión habilitado, IIS solo manejará una solicitud a la vez del mismo usuario. (Esto es cierto no solo en MVC.)

Por lo tanto, en una página con varias imágenes que devuelven esta Acción, solo se puede manejar una solicitud de imagen a la vez. Es sincrónico.

Me gustaría que esta Acción de imagen sea asincrónica I Me gustaría que se ejecutaran varias solicitudes de imagen para cada una sin necesidad de completar la anterior. (Si las imágenes fueran solo archivos estáticos, IIS las serviría de esta manera.)

Por lo tanto, me gustaría deshabilitar la sesión solo para llamadas a esa Acción, o para especificar que ciertas solicitudes no tienen estado de sesión. ¿Alguien sabe cómo se hace esto en MVC? ¡Gracias!

Author: Martin, 2009-09-23

8 answers

En lugar de implementar un filtro de acción para esto, ¿por qué no implementar un RouteHandler?

Aquí está el trato - IRouteHandler tiene un método - GetHttpHandler. Cuando haces una ASP.Net MVC solicitud a un controlador, por defecto el motor de enrutamiento maneja la solicitud mediante la creación de una nueva instancia de MvcRouteHandler, que devuelve un MvcHandler. MvcHandler es una implementación de IHttpHandler que está marcada con el (sorpresa!) IRequiresSessionState interfaz. Esta es la razón por la que una solicitud normal utiliza Session.

Si sigues mi blog post sobre cómo implementar un RouteHandler personalizado (en lugar de usar MvcRouteHandler) para servir imágenes - puede omitir devolver una sesión etiquetada IHttpHandler.

Esto debería liberar a IIS de imponerte sincronicidad. También es probable que sea más eficiente porque está omitiendo todas las capas del código MVC que se ocupan de los filtros.

 35
Author: womp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-16 09:05:41

Si alguien se encuentra en la situación en la que yo estaba, donde su controlador de imagen realmente necesita acceso de solo lectura a la sesión, puede poner el atributo SessionState en su controlador

[SessionState(SessionStateBehavior.ReadOnly)]

Véase http://msdn.microsoft.com/en-us/library/system.web.mvc.sessionstateattribute.aspx para más información.

Gracias a https://stackoverflow.com/a/4235006/372926

 51
Author: SamStephens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:39

Intente servir las imágenes desde otro dominio. Así que algo como images.mysite.com.

Esto le proporcionará dos beneficios: Uno, las sesiones son rastreadas por una cookie, por lo que images.mysite.com no quiero la galleta. Dos, le dará dos solicitudes simultáneas adicionales para recuperar imágenes.

¿Ha considerado configurar un HttpHandler para servir sus imágenes?

 6
Author: Chuck Conway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-23 06:26:05

También me encontré con el mismo problema y después de hacer I + D este enlace funcionó para mí Referencia: https://techatfingers.wordpress.com/2016/06/14/session-state-on-action /

  1. Crear atributo personalizado
  2. Invalida el método "getController Sessionbehavior" presente en la clase DefaultControllerFactory.
  3. Regístrelo en global.aspx

1> Crear atributo personalizado

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

2. Override

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

3. Registrar clase en Global.asax

public class MvcApplication : System.Web.HttpApplication
 {
        protected void Application_Start()
        {
            // --- other code ---
            ControllerBuilder.Current.SetControllerFactory(typeof(SessionControllerFactory));
        }
}
 5
Author: SeeTheC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-27 18:33:25

El atributo SessionState es bastante útil si u usa mvc3. Cómo lograr esto con mvc2 necesita un poco más de codificación.

La idea es decirle a la asp.net esa solicitud específica no usará el objeto de sesión.

Entonces, Cree un manejador de rutas personalizado para solicitudes específicas

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

SessionStateBehavior enum tiene 4 miembros, debe usar los modos "disabled" o "readonly" para obtener un comportamiento async.

Después de crear este manejador de rutas personalizado, asegúrese de que sus solicitudes específicas vayan a través de este controlador. Esto se puede hacer a través de la definición de nuevas rutas en Global.asax

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

Agregar esta ruta hace que todas sus solicitudes sean manejadas por su clase de controlador de ruta personalizada. Puede hacerlo específico definiendo diferentes rutas.

 4
Author: Serdar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-11 16:38:47

Cambie DefaultControllerFactory a la clase custom ControllerFactory. Controlador predeterminado.TempDataProvider use SessionStateTempDataProvider. puedes cambiarlo.

1.Establecer web.configuración / sistema.web / SessionState: mode = "Off".

2.crear clase 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)
    {
    }
  }

3.Create DictionaryTempDataControllerFactory

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

4.In global.asax.cs Apprication_Start event set DictionaryTempDataControllerFactory.

protected void Application_Start()
{
  RegisterRoutes(RouteTable.Routes);

  ControllerBuilder.Current.SetControllerFactory(
   new DictionaryTempDataControllerFactory()
  );
}
 3
Author: takepara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-23 15:29:12

En nuestro servidor, IIS ni siquiera sabe acerca de las sesiones - es el ASP.NET pila que maneja una solicitud por sesión a la vez. Los archivos estáticos, como las imágenes, nunca se ven afectados.

¿Es posible que su ASP.NET ¿la aplicación está sirviendo los archivos en lugar de IIS?

 1
Author: orip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-23 06:36:19

Crear un nuevo Controlador

Decorar el controlador con [SessionState(SessionStateBehavior.Disabled)]

Código de refactor para el que desea que seesion esté deshabilitado para ese controlador

 0
Author: Diemar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-27 12:58:27