현재 ASP.NET 세션이 null 인 경우 어떻게해야합니까?


125

내 웹 애플리케이션에서 다음과 같이 세션 변수를 읽습니다.

if (HttpContext.Current.Session != null &&  HttpContext.Current.Session["MyVariable"] != null)
{
    string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}

HttpContext.Current.Session [ "MyVariable"]이 null 인 이유를 확인하는 것이 왜 중요한지 이해합니다 (변수가 아직 세션에 저장되지 않았거나 여러 가지 이유로 세션이 재설정되었을 수 있음).하지만 확인해야하는 이유는 무엇입니까? 경우 HttpContext.Current.Session는 null입니다?

내 이해는 세션이 ASP.NET에 의해 자동으로 생성되므로 HttpContext.Current.Session이 null이 아니어야한다는 것입니다. 이 가정이 맞습니까? null이 될 수 있다면 무언가를 저장하기 전에 확인해야 함을 의미합니까?

if (HttpContext.Current.Session != null)
{
    HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
    // What should be done in this case (if session is null)?
    // Is it possible to force the session to be created if it doesn't exist?
}

ASP.NET WebApi 당신이 그것을 확인할 수 개의 다른 행동을해야합니다 ASP.NET 웹 API 사용하여 액세스 세션
티아구 Gouvêa

답변:


158

예, Session 개체는 null 일 수 있지만 다음과 같은 특정 상황에서만 발생합니다.

페이지에 코드 만있는 경우이 문제가 발생하지 않습니다. 대부분의 ASP .NET 코드는 null을 반복적으로 확인하지 않고 Session을 사용합니다. 그러나 IHttpModule을 개발 중이거나 그렇지 않으면 ASP .NET의 세부적인 세부 사항에 해당하지 않는 경우 고려해야 할 사항입니다.

편집하다

댓글에 대한 답변 : 세션 상태를 사용할 수 있는지 여부는 요청에 대해 AcquireRequestState 이벤트가 실행되었는지 여부에 따라 다릅니다. 이것은 세션 상태 모듈이 세션 쿠키를 읽고 적절한 세션 변수 세트를 찾아서 작동하는 곳입니다.

AcquireRequestState는 페이지에 제어권이 전달되기 전에 실행됩니다. 따라서 페이지에서 정적 클래스를 포함한 다른 기능을 호출하는 경우 괜찮습니다.

예를 들어 Application_Start 이벤트 또는 정적 생성자를 사용하여 시작하는 동안 초기화 논리를 수행하는 일부 클래스가있는 경우 세션 상태를 사용할 수 없습니다. 그것은 모두 현재 요청이 있고 AcquireRequestState가 실행되었는지 여부로 귀결됩니다.

또한 클라이언트가 쿠키를 비활성화 한 경우에도 Session 개체는 계속 사용할 수 있지만 다음 요청시 사용자는 새로운 빈 세션으로 반환됩니다. 이는 클라이언트가 아직 세션 상태 백이없는 경우 세션 상태 백이 제공되기 때문입니다. 클라이언트가 세션 쿠키를 전송하지 않으면 클라이언트를 동일하게 식별 할 수있는 방법이 없으므로 새 세션이 계속해서 전달됩니다.


6
오늘 찾은 간단한 업데이트입니다. 페이지 생성자에서 세션을 사용할 수 없습니다! Init 이벤트 또는 그 이후에만.
Nuno Agapito

방금 HttpContext.Current.Session == null이 마스터 페이지의 Page_Load 이벤트에 의해 호출되는 코드입니다. 분명히 이것은 페이지의 컨텍스트에서 발생할 있습니다. HttpContext.Current 개체를 검사하면 대부분의 멤버가 초기화되지만 CurrentNotification 및 IsPostNotification에서 {System.PlatformNotSupportedException} 오류가 발생합니다. 원인이 무엇이든이 문제는 프로덕션 환경에서 발생하지 않았으며 수년간 실행되었습니다. 플랫폼은 Windows Server 2003 R2 SP2이고 응용 프로그램에는 대상 프레임 워크 .Net 3.5가 있으며 세션 상태가 활성화 된 IIS에서 실행됩니다.
R. Schreurs

또한 IIS가 스타일 시트와 같이 디스크에 존재하는 리소스 파일에 대한 직접 요청을 제공 할 때 HttpContext.Current.Session`Application_AcquireRequestState '에서 코드를 작성할 때 null이 될 수 있음을 발견했습니다. 그러나 페이지 자체에 대한 요청은 세션 개체를 여기에서 코딩 할 수 있도록합니다. 이것은 적어도 MVC.NET 4에 있습니다.
성분

출력 캐시 된 MVC 작업 내에있는 경우에도 null이 될 수 있다고 생각합니다.
user2173353

40

다음 진술은 완전히 정확하지 않습니다.

"따라서 페이지에서 정적 클래스를 포함한 다른 기능을 호출하는 경우 문제가 없습니다."

HttpContext.Current.Session을 통해 세션을 참조하는 정적 메서드를 호출하고 있는데 null입니다. 그러나 jQuery를 사용하여 ajax를 통해 웹 서비스 메서드를 통해 메서드를 호출하고 있습니다.

여기서 알아 낸 것처럼 메서드의 간단한 속성으로 문제를 해결하거나 웹 서비스 세션 개체를 사용할 수 있습니다.

하지만 웹 메서드 내에서 세션 상태에 액세스하려면 다음과 같이 세션 상태 관리를 활성화해야합니다.

[WebMethod (EnableSession = true)]

EnableSession 값을 지정하면 이제 관리 세션을 사용할 수 있습니다. 이 값을 지정하지 않으면 null Session 개체가 생성되고 세션 개체에 액세스하려고 시도하는 동안 null 참조 예외가 발생할 가능성이 높습니다.

솔루션을 제공해 주신 Matthew Cozier에게 감사드립니다.

2 센트를 더할 줄 알았는데.

Ed


1
Ed에게 감사합니다. Session이 webmethod에서 null로 표시되었습니다. 추가하면 문제가 해결되었습니다. +1
fusi

1
글쎄, 웹 서비스를 호출 할 때 페이지가 아닌 다른 요청을 사용하므로 해당 문은 여전히 ​​IMO입니다.
driis

여기에 MSDN 문서 - the default value is false. 매력처럼 작동합니다.
Benjineer

22

Session 인스턴스가 null이고 'ashx'파일에있는 경우 'IRequiresSessionState'인터페이스를 구현하기 만하면됩니다.

이 인터페이스에는 멤버가 없으므로 클래스 선언 (C #) 뒤에 인터페이스 이름을 추가하기 만하면됩니다.

public class MyAshxClass : IHttpHandler, IRequiresSessionState

감사합니다. 로그인 클래스에서 세션이 null이었습니다. 난 내 ASHX 처리기에이 코드를 추가 할 때 너무 내 수업에 세션을 설정
ATES Danış에게

나는 이것이 질문에 아주 잘 대답한다고 생각합니다. 정말 고마워.
Sachin Joseph

2

ASP.NET 기술 문서

요약 : ASP.NET에서 모든 웹 페이지는 System.Web.UI.Page 클래스에서 파생됩니다. Page 클래스는 세션 데이터에 대한 HttpSession 개체의 인스턴스를 집계합니다. Page 클래스는 사용자 정의를위한 다양한 이벤트 및 메서드를 제공합니다. 특히 OnInit 메서드는 Page 개체의 초기화 상태를 설정하는 데 사용됩니다. 요청에 세션 쿠키가없는 경우 새 세션 쿠키가 요청자에게 발행됩니다.

편집하다:

세션 : 초보자를위한 개념

요약 : 사용자가 웹 애플리케이션의 페이지에 대한 첫 번째 요청을 서버에 보낼 때 세션이 생성되고, 애플리케이션은 세션을 생성하고 응답과 함께 사용자에게 세션 ID를 다시 보내고 클라이언트 컴퓨터에 작은 쿠키로 저장됩니다. . 따라서 이상적으로는 "쿠키를 비활성화 한 컴퓨터, 세션 정보가 저장되지 않습니다".


2

제 경우 ASP.NET State Service에는 중단되었습니다. 변경 Startup typeAutomatic처음으로 서비스를 수동으로 시작하는이 문제를 해결했다.

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