내 웹 애플리케이션에서 다음과 같이 세션 변수를 읽습니다.
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?
}
답변
예, Session 개체는 null 일 수 있지만 다음과 같은 특정 상황에서만 발생합니다.
- 당신은 비활성화 한 경우 sessionState의 HTTP 모듈 모두, 비활성화 세션을
- 코드가 HttpApplication.AcquireRequestState 이벤트 전에 실행되는 경우.
- 에서 코드 실행 을 IHttpHandler는 , 그 중 하나를 지정하지 않는 IRequiresSessionState 또는 IReadOnlySessionState 인터페이스를.
페이지에 코드 만있는 경우이 문제가 발생하지 않습니다. 대부분의 ASP .NET 코드는 null을 반복적으로 확인하지 않고 Session을 사용합니다. 그러나 IHttpModule을 개발 중이거나 그렇지 않으면 ASP .NET의 세부적인 세부 사항에 해당하지 않는 경우 고려해야 할 사항입니다.
편집하다
댓글에 대한 답변 : 세션 상태를 사용할 수 있는지 여부는 요청에 대해 AcquireRequestState 이벤트가 실행되었는지 여부에 따라 다릅니다. 이것은 세션 상태 모듈이 세션 쿠키를 읽고 적절한 세션 변수 세트를 찾아서 작동하는 곳입니다.
AcquireRequestState는 페이지에 제어권이 전달되기 전에 실행됩니다. 따라서 페이지에서 정적 클래스를 포함한 다른 기능을 호출하는 경우 괜찮습니다.
예를 들어 Application_Start 이벤트 또는 정적 생성자를 사용하여 시작하는 동안 초기화 논리를 수행하는 일부 클래스가있는 경우 세션 상태를 사용할 수 없습니다. 그것은 모두 현재 요청이 있고 AcquireRequestState가 실행되었는지 여부로 귀결됩니다.
또한 클라이언트가 쿠키를 비활성화 한 경우에도 Session 개체는 계속 사용할 수 있지만 다음 요청시 사용자는 새로운 빈 세션으로 반환됩니다. 이는 클라이언트가 아직 세션 상태 백이없는 경우 세션 상태 백이 제공되기 때문입니다. 클라이언트가 세션 쿠키를 전송하지 않으면 클라이언트를 동일하게 식별 할 수있는 방법이 없으므로 새 세션이 계속해서 전달됩니다.
답변
다음 진술은 완전히 정확하지 않습니다.
“따라서 페이지에서 정적 클래스를 포함한 다른 기능을 호출하는 경우 문제가 없습니다.”
HttpContext.Current.Session을 통해 세션을 참조하는 정적 메서드를 호출하고 있는데 null입니다. 그러나 jQuery를 사용하여 ajax를 통해 웹 서비스 메서드를 통해 메서드를 호출하고 있습니다.
여기서 알아 낸 것처럼 메서드의 간단한 속성으로 문제를 해결하거나 웹 서비스 세션 개체를 사용할 수 있습니다.
하지만 웹 메서드 내에서 세션 상태에 액세스하려면 다음과 같이 세션 상태 관리를 활성화해야합니다.
[WebMethod (EnableSession = true)]
EnableSession 값을 지정하면 이제 관리 세션을 사용할 수 있습니다. 이 값을 지정하지 않으면 null Session 개체가 생성되고 세션 개체에 액세스하려고 시도하는 동안 null 참조 예외가 발생할 가능성이 높습니다.
솔루션을 제공해 주신 Matthew Cozier에게 감사드립니다.
2 센트를 더할 줄 알았는데.
Ed
답변
Session 인스턴스가 null이고 ‘ashx’파일에있는 경우 ‘IRequiresSessionState’인터페이스를 구현하기 만하면됩니다.
이 인터페이스에는 멤버가 없으므로 클래스 선언 (C #) 뒤에 인터페이스 이름을 추가하기 만하면됩니다.
public class MyAshxClass : IHttpHandler, IRequiresSessionState
답변
요약 : ASP.NET에서 모든 웹 페이지는 System.Web.UI.Page 클래스에서 파생됩니다. Page 클래스는 세션 데이터에 대한 HttpSession 개체의 인스턴스를 집계합니다. Page 클래스는 사용자 정의를위한 다양한 이벤트 및 메서드를 제공합니다. 특히 OnInit 메서드는 Page 개체의 초기화 상태를 설정하는 데 사용됩니다. 요청에 세션 쿠키가없는 경우 새 세션 쿠키가 요청자에게 발행됩니다.
편집하다:
요약 : 사용자가 웹 애플리케이션의 페이지에 대한 첫 번째 요청을 서버에 보낼 때 세션이 생성되고, 애플리케이션은 세션을 생성하고 응답과 함께 사용자에게 세션 ID를 다시 보내고 클라이언트 컴퓨터에 작은 쿠키로 저장됩니다. . 따라서 이상적으로는 “쿠키를 비활성화 한 컴퓨터, 세션 정보가 저장되지 않습니다”.
답변
제 경우 ASP.NET State Service
에는 중단되었습니다. 변경 Startup type
에 Automatic
처음으로 서비스를 수동으로 시작하는이 문제를 해결했다.