2009-09-05 5 views
104

제 웹 응용 프로그램에서 세션 변수를 읽는 것과 같은 일을합니다.현재 ASP.NET 세션이 null 인 경우 어떻게해야합니까?

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? 
} 
+0

ASP.NET WebApi가 가지 다른 행동을해야합니다, 당신은 (http://stackoverflow.com/questions/9594229/accessing-session-using [세션 ASP.NET 웹 API를 사용하여 액세스]에 확인할 수 있습니다 -asp-net-web-api? answertab = votes # tab-top) –

답변

135

예 , Session 객체는 null이 될 수 있지만 특정 상황에서만 가능합니다. 당신이 SessionState http module을 사용할 경우 코드가 HttpApplication.AcquireRequestState 이벤트 전에 실행하는 경우 모두

  • 세션을 비활성화

    페이지에 코드 만있는 경우이 코드를 실행할 수 없습니다. 내 ASP .NET 코드의 대부분은 null을 반복적으로 확인하지 않고 Session을 사용합니다. 그러나 IHttpModule을 개발 중이거나 그렇지 않은 경우 ASP .NET의 세부 사항에 대해 생각해 보는 것이 좋습니다.

    주석에 대한 답변에서 편집

    는 : 상태를 사용할 수있는 세션 여부 AcquireRequestState 이벤트가 요청에 대한 실행 여부에 따라 달라집니다. 세션 상태 모듈은 세션 쿠키를 읽고 적절한 세션 변수 집합을 찾아서 작동합니다.

    AcquireRequestState는 제어가 페이지에 전달되기 전에 실행됩니다. 따라서 정적 클래스를 비롯한 다른 기능을 페이지에서 호출하는 경우에는 잘해야합니다.

    예를 들어 Application_Start 이벤트 또는 정적 생성자를 사용하여 시작할 때 초기화 논리를 수행하는 클래스가있는 경우 세션 상태를 사용하지 못할 수 있습니다. 현재 요청이 있는지 여부와 AcquireRequestState가 실행되었는지 여부에 따라 달라집니다.

    또한 클라이언트가 쿠키를 비활성화 한 경우에도 세션 객체를 계속 사용할 수 있지만 다음 요청시 사용자는 새로운 빈 Session을 반환합니다. 클라이언트에 세션 상태 태그가 없으면 세션 상태 태그가 주어지기 때문입니다. 클라이언트가 세션 쿠키를 전송하지 않으면 우리는 클라이언트를 동일하게 식별 할 방법이 없으므로 새로운 세션을 반복해서 넘겨 받게됩니다.

  • +4

    오늘 제가 찾은 바로 빠른 업데이트입니다. 세션을 페이지 생성자에서 사용할 수 없습니다! Init 이벤트에서만 또는 그 이후. –

    +0

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

    +0

    또한 IIS가 스타일 시트와 같이 디스크에있는 리소스 파일에 대한 직접 요청을 처리 할 때'HttpContext.Current.Session'은'Application_AcquireRequestState '에서 코드하기 위해 null이 될 수 있다는 것을 발견했습니다. 그러나 페이지 자체에 대한 요청은 세션 객체를 코드에 사용할 수있게합니다. 이것은 적어도 MVC.NET 4에 있습니다. –

    2

    ASP.NET Technical Articles

    SUMMARY: In ASP.NET, every Web page derives from the System.Web.UI.Page class. The Page class aggregates an instance of the HttpSession object for session data. The Page class exposes different events and methods for customization. In particular, the OnInit method is used to set the initialize state of the Page object. If the request does not have the Session cookie, a new Session cookie will be issued to the requester.

    편집 :

    Session: A Concept for Beginners

    SUMMARY: Session is created when user sends a first request to the server for any page in the web application, the application creates the Session and sends the Session ID back to the user with the response and is stored in the client machine as a small cookie. So ideally the "machine that has disabled the cookies, session information will not be stored".

    15

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

    public class MyAshxClass : IHttpHandler, IRequiresSessionState 
    
    +2

    Uploadify 업로드 스크립트를 사용하여 나를 위해 일해 주셔서 감사합니다. – Renan

    +0

    로그인 클래스에서 세션이 null이었습니다. 내 ashx 처리기에이 코드를 추가하면 클래스에 세션이 설정되었습니다. –

    +0

    이 질문에 대한 답변이 상당히 잘된 것 같습니다. 정말 고마워. –

    38

    다음 문이 완전히 정확하지 않습니다 :

    "So if you are calling other functionality, including static classes, from your page, you should be fine"

    방금 ​​(C#을) 클래스 선언 후 인터페이스 이름을 추가해야하므로

    이 인터페이스는 모든 회원이 없습니다

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

    당신이 방법에 대한 간단한 속성으로 문제를 해결하거나, 웹 서비스 세션 객체 사용할 수 있습니다 here 내가 발견으로 : 솔루션에 대한 마태 복음 편안해에

    There’s a trick though, in order to access the session state within a web method, you must enable the session state management like so:

    [WebMethod(EnableSession = true)]

    By specifying the EnableSession value, you will now have a managed session to play with. If you don’t specify this value, you will get a null Session object, and more than likely run into null reference exceptions whilst trying to access the session object.

    감사합니다.

    그냥 두 개의 센트를 추가한다고 생각했습니다.

    에드

    +1

    Ed, Session이 webmethod에서 null로 표시되었습니다. 수정 된 내용이 추가되었습니다. +1 – fusi

    +1

    글쎄, 웹 서비스를 호출 할 때 페이지에 대한 요청 외에 다른 요청을 사용하므로이 문은 여전히 ​​정확합니다. – driis

    +0

    MSDN 문서 [여기] (http://msdn.microsoft.com/en-us/library/byxd99hx%28v=vs.90%29.aspx#vbtskusingwebmethodattributeenablesession) - '기본값은 false입니다.' 매력처럼 작동합니다. – benjineer

    관련 문제