ASP에서 요청별 세션 상태를 사용하지 않도록 설정합니다.넷 MVC
ASP에 Action Result를 작성하고 있습니다.이미지를 제공할 NetMVC.세션 상태가 활성화된 경우 IIS는 동일한 사용자의 요청을 한 번에 하나만 처리합니다.(MVC에서만 해당되는 것은 아닙니다.)
따라서 이 작업으로 다시 호출하는 여러 이미지가 있는 페이지에서는 한 번에 하나의 이미지 요청만 처리할 수 있습니다.동기식입니다.
이 이미지 작업을 비동기식으로 수행합니다. 이전 이미지 작업을 완료할 필요 없이 각 이미지 요청을 여러 개 실행합니다.(이미지가 단지 정적 파일일 경우 IIS는 이러한 방식으로 이미지를 제공합니다.
따라서 해당 액션에 대한 호출에 대해서만 세션을 사용하지 않도록 설정하거나 특정 요청에 세션 상태가 없음을 지정합니다.MVC에서 어떻게 하는지 아는 사람?감사합니다!
이미지 컨트롤러에서 실제로 세션에 대한 읽기 전용 액세스 권한이 필요한 상황에 있는 사용자가 있는 경우 SessionState 특성을 컨트롤러에 배치할 수 있습니다.
[SessionState(SessionStateBehavior.ReadOnly)]
자세한 내용은 http://msdn.microsoft.com/en-us/library/system.web.mvc.sessionstateattribute.aspx 을 참조하십시오.
https://stackoverflow.com/a/4235006/372926 덕분입니다.
이에 대한 작업 필터를 구현하는 대신 다음을(를) 구현하는 것이 어떻습니까?RouteHandler
?
- 거는이렇니다습래다니▁here이.IRouteHandler
한 가지 방법이 있습니다.GetHttpHandler
ASP를 만들 때.하기 위해 " " "NetMVC", "" " " " "의 .MvcRouteHandler
는 반다니됩환이는을 합니다.MvcHandler
.MvcHandler
는 의구니다의 입니다.IHttpHandler
(래아!!)로 입니다.으로 표시됩니다.IRequiresSessionState
세션을 입니다.이것이 일반 요청이 세션을 사용하는 이유입니다.
사용자 정의 구현 방법에 대한 블로그 게시물을 팔로우하는 경우RouteHandler
사용하는 ) 를 제공하기 가 지정된 (MvcRouteHandler를 사용하여) 수 세션 태그가 지정된 세션 반환을 건너뛸 수 있습니다.IHttpHandler
.
이렇게 하면 IIS가 사용자에게 동기화를 적용하지 않습니다.또한 필터를 처리하는 MVC 코드의 모든 계층을 건너뛰기 때문에 성능이 더 좋을 수 있습니다.
저는 또한 같은 문제를 발견했고 연구개발을 한 후 이 링크가 저에게 도움이 되었습니다. 참조: https://techatfingers.wordpress.com/2016/06/14/session-state-on-action/
- 사용자 지정 특성 만들기
- 클래스 DefaultControllerFactory에 있는 "GetControllerSessionBehavior" 메서드를 재정의합니다.
- global.aspx에 등록합니다.
사용자 지정 특성 만들기
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);
}
Global.asax에 클래스를 등록합니다.
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// --- other code ---
ControllerBuilder.Current.SetControllerFactory(typeof(SessionControllerFactory));
}
}
다른 도메인에서 이미지를 제공해 보십시오.images.mysite.com 같은 것입니다.
이를 통해 다음과 같은 두 가지 이점을 얻을 수 있습니다.첫째, 세션은 쿠키에 의해 추적되기 때문에 images.mysite.com 에는 쿠키가 없습니다.둘째, 이미지 검색을 위한 추가적인 두 개의 동시 요청을 제공합니다.
이미지를 제공하기 위해 HttpHandler를 설정하는 것을 고려해 보셨습니까?
mvc3를 사용하는 경우 SessionState 특성이 매우 유용합니다.mvc2로 이를 달성하는 방법은 코딩이 조금 더 필요합니다.
아이디어는 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개의 멤버가 있습니다. 비동기 동작을 가져오려면 "사용 안 함" 또는 "읽기 전용" 모드를 사용해야 합니다.
이 사용자 지정 경로 처리기를 만든 후에는 특정 요청이 이 처리기를 통과해야 합니다.이 작업은 Global.asax에서 새 경로를 정의하여 수행할 수 있습니다.
routes.Add("Default", new Route(
"{controller}/{action}",
new RouteValueDictionary(new { controller = "Home", action = "Index"}),
new CustomRouteHandler()
));
이 경로를 추가하면 모든 요청이 사용자 지정 경로 처리기 클래스에서 처리됩니다.다른 경로를 정의하여 이를 구체적으로 지정할 수 있습니다.
기본값 변경ControllerFactory에서 사용자 지정 ControllerFactory 클래스로 이동합니다.기본 컨트롤러.TempDataProvider는 SessionStateTempDataProvider를 사용합니다.변경할 수 있습니다.
1.web.config/system.web/sessionState:mode="Off"를 설정합니다.
2.사전 만들기TempDataProvider 클래스입니다.
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.사전 만들기온도 데이터 컨트롤러 팩토리
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. global.asax.cs 에서 Application_Start 이벤트 세트 사전TempDataControllerFactory.
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(
new DictionaryTempDataControllerFactory()
);
}
서버에서 IIS는 세션에 대해서도 알지 못합니다. 바로 ASP입니다.세션당 하나의 요청을 한 번에 처리하는 NET 스택입니다.이미지와 같은 정적 파일은 영향을 받지 않습니다.
당신의 ASP가 가능합니까?NET 앱이 IIS 대신 파일을 제공합니까?
새 컨트롤러 생성
[SessionState(SessionStateBehavior)]로 컨트롤러를 장식합니다.사용 안 함)]
해당 컨트롤러에 대해 비활성화 상태로 표시할 리팩터 코드
ASP 비활성화를 위한 솔루션을 공유하고자 합니다.HttpModule을 사용하는 특정 요청(나의 경우 WCF 서비스)에 대한 NET 세션:
public class AspNetSessionFilterModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.PostMapRequestHandler += OnPostMapRequestHandler;
}
private void OnPostMapRequestHandler(object sender, EventArgs e)
{
var context = (sender as HttpApplication).Context;
DisableSessionForSomeRequests(context);
}
private void DisableSessionForSomeRequests(HttpContext context)
{
if ("~/Services/MyService.svc".Equals(context.Request.AppRelativeCurrentExecutionFilePath, StringComparison.InvariantCultureIgnoreCase))
{
context.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Disabled);
}
}
public void Dispose()
{ }
}
언급URL : https://stackoverflow.com/questions/1464203/disable-session-state-per-request-in-asp-net-mvc
'programing' 카테고리의 다른 글
숭고한 텍스트 3에서 C를 컴파일하고 실행하는 방법은 무엇입니까? (0) | 2023.08.07 |
---|---|
Python 목록 인덱스의 콜론(:) (0) | 2023.08.07 |
SQL에서 두 테이블이 서로 참조해도 괜찮습니까? (0) | 2023.08.07 |
로그인 없이 생성된 사용자에게 로그인 할당(SQL Server) (0) | 2023.08.07 |
Spring 데이터가 포함된 날짜별 ASC 주문 (0) | 2023.08.07 |