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


157

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

Session["loginId"]

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

Session["loginId"]

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

답변:


363

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

6
코드를 작성할 필요가 없으며 답변에 표시된대로 사용하십시오. 예를 들어 "public int LoginId {get; set;}"-> 이것을 자동 속성이라고합니다.
M4N

4
.net 3.x를 사용하는 경우 내 코드에 표시된 것처럼 자동 속성을 사용할 수 있습니다. .net 2.x / 1.x에서는이 기능을 사용할 수 없으므로 속성의 getter / setter를 직접 구현해야합니다. private int _loginId; public int LoginId {get {return _loginId; } set {_loginId = 값; }}
M4N

2
지금은 멋지게 보입니다. 내 문제에 대한 답을 얻었습니다. 귀하의 방법을 사용하여 이미 깨끗하고 모든 세션 변수를 한곳에서 쉽게 유지할 수 있습니다. 감사합니다 @Martin, 당신은 굉장합니다.
Prashant 2016 년

23
@ M4N, +1보다 약간 더 감사를 표현할 수 있기를 바랍니다. 이것은 내 프로젝트에서 세션 / 캐시를 다루는 가장 좋아하는 방법이되었습니다. 내 코드는 말 그대로 감사합니다.
Brandon Boone

4
'Current'속성이 정적 인 동안 @Kristopher는 반환 된 MySession 인스턴스가 아닙니다 ... 그래서 괜찮습니다. 정적 메서드와 속성 은 이런 식으로 사용하는 것이 안전합니다.
Darren

104

스레드 HttpContext를 통해 세션에 액세스하십시오.

HttpContext.Current.Session["loginId"]

이 간단한 단계에 대해 많은 Anthony에게 감사합니다.
Kings

덕분에 많은 안토니, 그에 대한 + 1
Owais 쿠 레시

감사. 네임 스페이스가 무엇인지 잊어 버렸습니다 :)
Anthony Horne

@AnthonyWJones 나는 당신의 방법을 사용했지만 문제가 있습니다. 내가 틀렸거나 올바른 사용법이 무엇인지 설명 할 수 있습니까, 내 질문 stackoverflow.com/questions/45254279/…
adnan

그리고 HttpSessionStateBase로 변환하려면 다음을 수행하십시오. HttpSessionStateBase session = new HttpSessionStateWrapper (HttpContext.Current.Session); 다시 : stackoverflow.com/questions/5447611/…
sobelito

24

제안 된 솔루션의 문제점은 Out-of-process 세션 스토리지를 사용하는 경우 SessionState에 내장 된 일부 성능 기능을 손상시킬 수 있다는 것입니다. ( "상태 서버 모드"또는 "SQL 서버 모드"). oop 모드에서 세션 데이터는 페이지 요청이 끝날 때 직렬화되고 페이지 요청이 시작될 때 역 직렬화되어야하며, 이는 비용이 많이들 수 있습니다. 성능을 향상시키기 위해 SessionState는 변수에 처음 액세스 할 때 deserialize 변수만으로 필요한 항목을 deserialize하려고 시도하고 변경된 변수 만 다시 직렬화하고 대체합니다. 세션 변수가 많고 모두 하나의 클래스로 밀어 넣는 경우 세션을 사용하는 모든 페이지 요청에서 세션의 모든 항목이 직렬화 해제되며 클래스가 변경 되었기 때문에 하나의 속성 만 변경 되었더라도 모든 항목을 다시 직렬화해야합니다. 많은 세션과 oop 모드를 사용하는 경우 고려해야 할 사항입니다.


4
이것을 강화하기 위해 +1. 세션에 InProc을 사용하지 않으면 Ernie가 100 % 정확합니다. InProc은 웹팜을 지원하지 않으므로 응용 프로그램이 다시 시작되면 손실되므로 매우 제한적입니다. 성능 비용으로 우리는 상태 서버 모드 사용에서 20 %의 프리미엄을보고 있으며 그 위에 직렬화 비용이 추가됩니다. 당신이 상상할 수 있듯이 이것은 비쌀 수 있습니다. 기본 유형 (예 : int, string, char, byte 등)을 고수하여 일부 직렬화 오버 헤드를 피할 수 있습니다. 사용자 정의 개체는 직렬화에 직면하게됩니다. 사용자는 조심하십시오.
잭 얀센

좋은 지적 +1 두 가지 개념을 결합시키는 변경 사항은이 사용자 정의 "세션"클래스의 각 속성이 세션에서 하나의 큰 객체 대신 asp.net 세션 자체를 호출하도록하는 것입니다. @ M4N의 접근 방식으로 피할 수있는 유형 캐스팅을 수행해야하지만 매번 세션의 일부만 읽으면 가치가 있습니다.
eol

12

내 앞에 제시된 답변은 문제에 대한 적절한 해결책을 제공하지만이 오류가 발생하는 이유를 이해하는 것이 중요하다고 생각합니다.

Session속성은 특정 요청과 관련된 Page유형의 인스턴스를 반환합니다 HttpSessionState. Page.Session실제로 호출하는 것과 같습니다 Page.Context.Session.

MSDN 은 이것이 가능한 방법을 설명합니다.

ASP.NET 페이지에는 HttpContext클래스 가 포함 된 System.Web 네임 스페이스에 대한 기본 참조가 포함되어 있기 때문에 HttpContext에 대한 정규화 된 클래스 참조없이 .aspx 페이지 에서 멤버를 참조 할 수 있습니다 HttpContext.

그러나 App_Code의 클래스 내에서이 속성에 액세스하려고하면 클래스가 페이지 클래스에서 파생되지 않으면 속성을 사용할 수 없습니다.

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


즉, 좋은 설명입니다, 그 :) 나에게 일을 도왔다
Owais 쿠 레시에게

1

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

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

엄마


1

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/


0

이는 응용 프로그램과 개발자 모두에게 더 효율적입니다.

웹 프로젝트에 다음 클래스를 추가하십시오.

/// <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;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.