Wyłącz stan sesji na żądanie w ASP.Net MVC

Tworzę ActionResult w ASP.Net MVC do serwowania obrazów. Po włączeniu stanu sesji usługi IIS będą obsługiwać tylko jedno żądanie tego samego użytkownika. (Dotyczy to nie tylko MVC.)

W związku z tym, na stronie z wieloma obrazami wywołującymi tę akcję, tylko jedno żądanie obrazu może być obsługiwane jednocześnie. Jest synchroniczny.

Chciałbym, aby ta akcja obrazu była asynchroniczna -- chciałbym, aby każda z nich wykonywała wiele żądań obrazu bez konieczności wykonania poprzedniego. (Gdyby obrazy były tylko plikami statycznymi, IIS podałby je w ten sposób.)

Tak więc, chciałbym wyłączyć sesję tylko dla wywołań do tej akcji, lub określić, że niektóre żądania nie mają stanu sesji. Wie ktoś jak to się robi w MVC? Dzięki!

Author: Martin, 2009-09-23

8 answers

Zamiast zaimplementować filtr akcji, dlaczego nie zaimplementujesz RouteHandler?

Oto umowa- IRouteHandler ma jedną metodę - GetHttpHandler. Kiedy zrobisz ASP.Net żądanie MVC do kontrolera, domyślnie silnik routingu obsługuje żądanie, tworząc nową instancję MvcRouteHandler, która zwraca MvcHandler. MvcHandler jest implementacją IHttpHandler oznaczoną (surprise!) IRequiresSessionState interfejs. To dlatego normalne żądanie używa sesji.

If you follow my blog post o tym, jak zaimplementować niestandardowe RouteHandler (zamiast używać MvcRouteHandler) do serwowania obrazów - możesz pominąć zwracanie sesji-tagged IHttpHandler.

To powinno uwolnić IIS od narzucania Ci synchroniczności. Prawdopodobnie będzie również bardziej wydajny, ponieważ pomija wszystkie warstwy kodu MVC zajmujące się filtrami.
 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-16 09:05:41

Jeśli ktoś jest w sytuacji, w której twój kontroler obrazu potrzebuje dostępu tylko do odczytu sesji, możesz umieścić atrybut SessionState na kontrolerze

[SessionState(SessionStateBehavior.ReadOnly)]

Zobacz http://msdn.microsoft.com/en-us/library/system.web.mvc.sessionstateattribute.aspx aby uzyskać więcej informacji.

Dzięki 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:39

Spróbuj podać obrazy z innej domeny. Więc coś w rodzaju images.mysite.com.

Zapewni Ci to dwie korzyści: po pierwsze, sesje są śledzone przez plik cookie, więc images.mysite.com nie chcę ciastka. Dwa, to daje dodatkowe dwa równoczesne żądania pobierania obrazów.

Czy rozważałeś skonfigurowanie Httphandlera do serwowania obrazów?

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-23 06:26:05

Ja również natknąłem się na ten sam problem i po zrobieniu badań i Rozwoju ten link zadziałał dla mnie Bibliografia: https://techatfingers.wordpress.com/2016/06/14/session-state-on-action/

  1. utwórz własny atrybut
  2. nadpisuje metodę "GetControllerSessionBehavior" obecną w klasie DefaultControllerFactory.
  3. zarejestruj go w global.aspx

1> utwórz własny atrybut

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. Zarejestruj się Klasa W 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-27 18:33:25

Atrybut SessionState jest bardzo pomocny, jeśli używasz mvc3. Jak to osiągnąć z mvc2 wymaga trochę więcej kodowania.

/ Align = "left" / asp.net to konkretne żądanie nie będzie używać obiektu sesji.

Tak więc, utwórz niestandardową obsługę trasy dla określonych żądań

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 ma 4 członków, powinieneś użyć trybów "disabled" lub "readonly", aby uzyskać zachowanie asynchroniczne.

Po utworzeniu tego niestandardowego programu obsługi trasy upewnij się, że Twoje konkretne żądania zostaną wysłane przez tego opiekuna. Można to zrobić poprzez zdefiniowanie nowych tras w Global.asax

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

Dodanie tej trasy sprawia, że wszystkie Twoje żądania będą obsługiwane przez Twoją niestandardową klasę obsługi trasy. Możesz go uszczegółowić, definiując różne trasy.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-11 16:38:47

Zmień domyślną klasę ControllerFactory na własną klasę ControllerFactory. Domyślny Kontroler.TempDataProvider użyj SessionStateTempDataProvider. możesz to zmienić.

1.Ustaw sieć.config / system.web / sessionState: mode = "Off".

2.Utwórz klasę 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.Tworzenie 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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-23 15:29:12

Na naszym serwerze IIS nawet nie wie o sesjach - to ASP.NET stos, który obsługuje jedno żądanie na sesję na raz. Pliki statyczne, takie jak obrazy, nigdy nie są naruszane.

Czy to możliwe, że Twój ASP.NET aplikacja obsługuje pliki zamiast 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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-23 06:36:19

Utwórz nowy kontroler

Udekoruj kontroler za pomocą [SessionState (SessionStateBehavior.Disabled)]

Kod refaktoringu, dla którego chcesz mieć wyłączony seesion dla tego kontrolera

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 12:58:27