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!
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
.
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.
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?
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/
- utwórz własny atrybut
- nadpisuje metodę "GetControllerSessionBehavior" obecną w klasie DefaultControllerFactory.
- 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));
}
}
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.
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()
);
}
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?
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
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