[C#] ASP.NET의 모든 클래스에서 세션 변수에 액세스하는 방법은 무엇입니까?

내 응용 프로그램의 App_Code 폴더에 클래스 파일을 만들었습니다. 세션 변수가 있습니다

Session["loginId"]

내 수업 에서이 세션 변수에 액세스하고 싶지만 다음 줄을 쓸 때 오류가 발생합니다.

Session["loginId"]

누구나 ASP.NET 2.0 (C #)의 app_code 폴더에 생성 된 클래스 내의 세션 변수에 액세스하는 방법을 알려줄 수 있습니까?



답변

(완전성을 위해 업데이트 됨) 다음을
사용하여 모든 페이지를 사용하거나 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;

이 방법에는 몇 가지 장점이 있습니다.

  • 그것은 많은 유형 캐스팅에서 당신을 구해줍니다.
  • 애플리케이션 전체에서 하드 코딩 된 세션 키를 사용할 필요가 없습니다 (예 : Session [ “loginId”]
  • MySession의 특성에 대한 XML 문서 주석을 추가하여 세션 항목을 문서화 할 수 있습니다.
  • 세션 변수를 기본값으로 초기화 할 수 있습니다 (예 : null이 아닌지 확인).

답변

스레드 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의 클래스 내에서이 속성에 액세스하려고하면 클래스가 페이지 클래스에서 파생되지 않으면 속성을 사용할 수 없습니다.

이 자주 발생하는 시나리오에 대한 나의 해결책은 결코 페이지 객체를 클래스에 전달하지 않는다는 것 입니다. 오히려 세션 페이지에서 필요한 객체를 추출하여 경우에 따라 이름-값 수집 / 배열 / 목록 형식으로 클래스에 전달합니다.


답변

사용자 정의 세션 클래스 내에서 세션 변수를 조작하려고했기 때문에 동일한 오류가 발생했습니다.

현재 컨텍스트 (system.web.httpcontext.current)를 클래스에 전달해야했고 모든 것이 잘 작동했습니다.

엄마


답변

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;