답변:
(완전성을 위해 업데이트 됨) 다음을
사용하여 모든 페이지를 사용하거나 Session["loginId"]
클래스를 사용하거나 사용 하는 클래스 (예 : 클래스 라이브러리 내부) 에서 세션 변수에 액세스 할 수 있습니다.System.Web.HttpContext.Current.Session["loginId"].
그러나 원래 답변을 읽으십시오 ...
항상 ASP.NET 세션 주위에 래퍼 클래스를 사용하여 세션 변수에 대한 액세스를 단순화합니다.
public class MySession
{
// private constructor
private MySession()
{
Property1 = "default value";
}
// Gets the current session.
public static MySession Current
{
get
{
MySession session =
(MySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new MySession();
HttpContext.Current.Session["__MySession__"] = session;
}
return session;
}
}
// **** add your session properties here, e.g like this:
public string Property1 { get; set; }
public DateTime MyDate { get; set; }
public int LoginId { get; set; }
}
이 클래스는 ASP.NET 세션에 하나의 인스턴스를 저장하고 다음과 같이 모든 클래스에서 형식 안전 방식으로 세션 속성에 액세스 할 수 있도록합니다.
int loginId = MySession.Current.LoginId;
string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;
DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;
이 방법에는 몇 가지 장점이 있습니다.
스레드 HttpContext를 통해 세션에 액세스하십시오.
HttpContext.Current.Session["loginId"]
제안 된 솔루션의 문제점은 Out-of-process 세션 스토리지를 사용하는 경우 SessionState에 내장 된 일부 성능 기능을 손상시킬 수 있다는 것입니다. ( "상태 서버 모드"또는 "SQL 서버 모드"). oop 모드에서 세션 데이터는 페이지 요청이 끝날 때 직렬화되고 페이지 요청이 시작될 때 역 직렬화되어야하며, 이는 비용이 많이들 수 있습니다. 성능을 향상시키기 위해 SessionState는 변수에 처음 액세스 할 때 deserialize 변수만으로 필요한 항목을 deserialize하려고 시도하고 변경된 변수 만 다시 직렬화하고 대체합니다. 세션 변수가 많고 모두 하나의 클래스로 밀어 넣는 경우 세션을 사용하는 모든 페이지 요청에서 세션의 모든 항목이 직렬화 해제되며 클래스가 변경 되었기 때문에 하나의 속성 만 변경 되었더라도 모든 항목을 다시 직렬화해야합니다. 많은 세션과 oop 모드를 사용하는 경우 고려해야 할 사항입니다.
내 앞에 제시된 답변은 문제에 대한 적절한 해결책을 제공하지만이 오류가 발생하는 이유를 이해하는 것이 중요하다고 생각합니다.
의 Session
속성은 특정 요청과 관련된 Page
유형의 인스턴스를 반환합니다 HttpSessionState
. Page.Session
실제로 호출하는 것과 같습니다 Page.Context.Session
.
MSDN 은 이것이 가능한 방법을 설명합니다.
ASP.NET 페이지에는
HttpContext
클래스 가 포함 된 System.Web 네임 스페이스에 대한 기본 참조가 포함되어 있기 때문에HttpContext
에 대한 정규화 된 클래스 참조없이 .aspx 페이지 에서 멤버를 참조 할 수 있습니다HttpContext
.
그러나 App_Code의 클래스 내에서이 속성에 액세스하려고하면 클래스가 페이지 클래스에서 파생되지 않으면 속성을 사용할 수 없습니다.
이 자주 발생하는 시나리오에 대한 나의 해결책은 결코 페이지 객체를 클래스에 전달하지 않는다는 것 입니다. 오히려 세션 페이지에서 필요한 객체를 추출하여 경우에 따라 이름-값 수집 / 배열 / 목록 형식으로 클래스에 전달합니다.
asp.net 코어에서 이것은 다르게 작동합니다.
public class SomeOtherClass
{
private readonly IHttpContextAccessor _httpContextAccessor;
private ISession _session => _httpContextAccessor.HttpContext.Session;
public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void TestSet()
{
_session.SetString("Test", "Ben Rules!");
}
public void TestGet()
{
var message = _session.GetString("Test");
}
}
출처 : https://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/
이는 응용 프로그램과 개발자 모두에게 더 효율적입니다.
웹 프로젝트에 다음 클래스를 추가하십시오.
/// <summary>
/// This holds all of the session variables for the site.
/// </summary>
public class SessionCentralized
{
protected internal static void Save<T>(string sessionName, T value)
{
HttpContext.Current.Session[sessionName] = value;
}
protected internal static T Get<T>(string sessionName)
{
return (T)HttpContext.Current.Session[sessionName];
}
public static int? WhatEverSessionVariableYouWantToHold
{
get
{
return Get<int?>(nameof(WhatEverSessionVariableYouWantToHold));
}
set
{
Save(nameof(WhatEverSessionVariableYouWantToHold), value);
}
}
}
구현은 다음과 같습니다.
SessionCentralized.WhatEverSessionVariableYouWantToHold = id;