2012-05-10 2 views
6

내가 좋아하는 세션을 확인하고이왜 세션 객체가 null 참조 예외를 throw합니까? 내 aspx 페이지의 일부에

if (bool.Parse(Session["YourAssessment"].ToString()) == false 
    && bool.Parse(Session["MyAssessment"].ToString()) == true) 
{ 
    Response.Redirect("~/myAssessment.aspx"); 
} 

그것은 내가 자주 페이지를 계속 연주하면 잘 작동하지만 5 분 이상, 심지어 페이지와 아무것도하지 않는 경우 페이지를 실행하는 일부 몸이 나에게 이상한 행동을 설명 할 수이

[NullReferenceException: Object reference not set to an instance of an object.] 
    yourAssessment.Page_Load(Object sender, EventArgs e) in d:\Projects\NexLev\yourAssessment.aspx.cs:27 
    System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 
    System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35 
    System.Web.UI.Control.OnLoad(EventArgs e) +91 
    System.Web.UI.Control.LoadRecursive() +74 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2207 

에 대한 오류

Object reference not set to an instance of an object. 

다음은 스택을 던져?

기본적으로 세션은 20 분입니다.

편집

은 버튼을 클릭 나는 그것이이

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!HttpContext.Current.Request.IsAuthenticated) 
    { 
     Response.Redirect("~/login.aspx"); 
    } 
    else 
    { 
     Session["YourAssessment"] = false; 
     Session["MyAssessment"] = false; 
    } 
} 

처럼 확인 기본 페이지에서 를 리디렉션 할 수있는 몇 가지 기준으로 수정 버튼을 가지고 페이지 기본 영문을 참조하십시오

protected void imgClientFreeEval_Click(object sender, 
    System.Web.UI.ImageClickEventArgs e) 
{ 
    if (HttpContext.Current.Request.IsAuthenticated) 
    { 
     string sqlQuery = "SELECT count(*) FROM SurveyClient WHERE UserID='" 
      + cWebUtil.GetCurrentUserID().ToString() + "'"; 
     SqlParameter[] arrParams = new SqlParameter[0]; 
     int countSurvey = int.Parse(
      Data.GetSQLScalerVarQueryResults(sqlQuery).ToString()); 
     if (countSurvey > 0) 
     { 
      Session["YourAssessment"] = true; 
      Session["MyAssessment"] = false; 
     } 
     Response.Redirect((countSurvey > 0) 
      ? "~/yourAssessment.aspx" 
      : "~/myAssessment.aspx"); 
    } 
    else 
    { 
     Response.Redirect("~/login.aspx"); 
    } 

을 가지고 있으며, myAssessment 페이지에이

처럼 확인
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!HttpContext.Current.Request.IsAuthenticated) 
    { 
     Response.Redirect("~/login.aspx"); 
    } 
    else 
    { 
     if (Session["YourAssessment"] != null 
      && Session["MyAssessment"] != null 
      && bool.Parse(Session["YourAssessment"].ToString()) 
      && !bool.Parse(Session["myAssessment"].ToString())) 
     { 
      Response.Redirect("~/yourAssessment.aspx"); 
     } 
    } 
} 

및 yourAssessmtn에 설명하십시오 뭐가 잘못이

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!HttpContext.Current.Request.IsAuthenticated) 
    { 
     Response.Redirect("~/login.aspx"); 
    } 
    else 
    { 
     if (Session["YourAssessment"] != null 
      && Session["MyAssessment"] != null 
      && !bool.Parse(Session["YourAssessment"].ToString()) 
      && bool.Parse(Session["MyAssessment"].ToString())) 
     { 
      Response.Redirect("~/myAssessment.aspx"); 
     } 

     PopulateAllSurveyByUser(); 
     if (ViewState["surveyClientID"] != null) 
     { 
      grdSurveyDetail.Visible = true; 
      PopulateSurveyDetails(
       int.Parse(ViewState["surveyClientID"].ToString())); 
     } 
     else 
     { 
      grdSurveyDetail.Visible = false; 
     } 
    } 
} 

처럼 확인?

+0

에는 "YourAssessment"이 없기 때문에 또는 "MyAssessment"키를 누르십시오. –

+0

ok 내 세션이 null이되지만 null이되면 어떤 동작을 취합니까? – NoviceToDotNet

+0

잘 당신이 할 수있는 최선의 일은 세션에서 가치를 넣어입니다;) 그냥 농담, 어디 세션 변수를 설정합니까, 귀하의 코드를 표시 –

답변

9

같은 null

확인하지 않은 사용자 세션 변수가 존재하는지 여부를 확인하는 첫번째 필요

if(Session["YourAssessment"] != null) 
    // Do something with it 
else 
    // trying to call Session["YourAssessment"].ToString() here will FAIL. 

세션에 수명주기가 있기 때문에 이런 일이 발생합니다. 즉, 만료 됨 (만료됨을 정의하는 쿠키가 만료 됨)이므로 개체가 사라집니다. 세션이 오래 지속될 수 있도록 web.config에서 sessionState timeout을 증가시킬 수 있습니다. Web.config의

<system.web> 
     <sessionState timeout="40" /> 
    </system.web> 

예를 들어

는 한 클라이언트가 그것을 명확하지 않기 때문에 40 분 동안 세션의 마지막을 만들 것, 웹 서버는 최대 & 실행 중입니다.

+0

그럼에도 불구하고 브라우저는 세션/쿠키를 지울 수 있습니다. 인생은 브라우저에서 힘들어합니다. – CodingBarfield

+0

@CodingBarfield, 그 이유는 클라이언트가 그것을 지우지 않는 한 * * – Shai

+0

그래,하지만 내 경우에는 내가 로그 아웃에만 session.abandon을 지웠다. – NoviceToDotNet

1

먼저이

if (!bool.Parse(Session["YourAssessment"].ToString()) && 
    bool.Parse(Session["MyAssessment"].ToString())) 
    Response.Redirect("~/myAssessment.aspx"); 

같은 코드를 사용할 수 있습니다 당신은 반드시 세션이

if (Session["YourAssessment"] != null && Session["MyAssessment"] != null && 
    !bool.Parse(Session["YourAssessment"].ToString()) && 
    bool.Parse(Session["MyAssessment"].ToString())) 
     Response.Redirect("~/myAssessment.aspx"); 
+0

하지만 세션이 5 회의 민트에서 null이 될 수 있습니다 – NoviceToDotNet

+0

improc 세션을 사용하는 경우 IIS에서 작업자 프로세스가 다시 시작됩니다. –

+0

ok 세션이 null이되지만 그것이 null이되면 어떤 행동을 취해야합니까? – NoviceToDotNet

1

Session이 null이 아닌 경우 키 "YourAssessment""MyAssessment"이 있는지 다시 확인하십시오.

3

세션 객체에 액세스 할 때 항상 null을 확인하십시오!
당신은 사용할 수있는 몇 가지 작은 유틸리티를 쓸 수 있습니다 : 응용 프로그램 풀 재활용 경우

public class SessionData 
{ 
    public static T Get<T>(string key) 
    { 
     object value = HttpContext.Current.Session[key]; 

     if(value == null) 
      return default(T); 

     try 
     { 
      return (T)value; 
     } 
     catch(Exception e) 
     { 
      return default(T); 
     } 
    } 

    public static void Put(string key, object value) 
    { 
     HttpContext.Current.Session[key] = value; 
    } 
} 

세션은 널 (null)이 될 수 있습니다. 수많은 이유 때문에 이런 일이 발생할 수 있습니다 ...

서버를 잃어 버리지 않도록 서버를 보호하기위한 하나의 트릭은 자바 스크립트에서 서버로 "핑"합니다. 매분마다 약간의 더미 URL (빈 페이지 또는 perf freak 인 경우 .ashx 처리기)에 요청할 수 있습니다. 거대한 편집 양식과 같이 오랫동안 열려있는 페이지에 유용 할 수 있습니다.
또한 디버그 및 릴리스 구성에 대한 세션 시간 제한 값이 다릅니다!

1

세션이 만료되면 Session [ "YourAssessment"]와 같은 세션에있는 객체는 null이되고 해당 객체의 .toString() 메소드 호출은 Object 참조 오류를 발생시킵니다. 이 문제를 해결하려면 먼저 toString()을 수행하기 전에 세션 변수가 null인지 확인해야합니다. 그 문제는 IIS 보인다

+0

괜찮아요 내 세션 null을 받고 있지만 null을 얻는다면 내가 무슨 행동을할까요? – NoviceToDotNet

+0

죄송합니다. 귀하의 질문을 처음 보았습니다. "Your Assessment"에 null이 붙는다면 사용자 정의 오류 페이지로 리디렉션하고 평가를 선택하지 않았 음을 나타내는 오류를 사용자에게 표시하는 것이 가장 좋습니다. 앱의 전체적인 세부 사항을 모른 채 어떻게 처리해야하는지 말하기는 어렵지만 모든 애플리케이션은 오류를 정상적으로 표시해야합니다. 사용자에게 특정 오류를 표시하고 싶지 않으면 "오류가 있음"을 나타내는 페이지 자체에 오류를 리디렉션하거나 표시하고 의미있는 어딘가에 로그인하십시오. – DRobertE

1

응용 프로그램이 재시작되고 세션이 세션 변수를 삭제할 수있는 inproc에 저장되는 경우. 따라서 응용 프로그램의 종료 이벤트를 기록하고이 경우가 있는지 확인하려고 Global.asax.cs의 application_end 이벤트에 넣고,이 코드는 응용 프로그램을 다시 시작 로그 것하고 무슨 일이 있었 이유 :

protected void Application_End(object sender, EventArgs e) 
{ 
    HttpRuntime runtime = (HttpRuntime)typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null); 

    string shutDownMessage = ""; 

    if (runtime != null) 
    { 
    shutDownMessage = Environment.NewLine + "Shutdown: " + 
         (string)runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null) + 
         Environment.NewLine + "Stack: " + Environment.NewLine + 
         (string)runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null); 
    } 

    string logFile = HttpContext.Current.Server.MapPath(~/AppEndLog.log"); 
    string logMsg = ""; 
    if (File.Exists(logFile)) 
    logMsg = logMsg + File.ReadAllText(logFile) + Environment.NewLine + Environment.NewLine; 
    logMsg = logMsg + Environment.NewLine + "ApplicationEnd - " + DateTime.Now.ToString() + shutDownMessage; 
    File.WriteAllText(logFile, logMsg); 


} 
1

그럼 이것에 대해 기록 된 모든 후)이며, 대신에 내가하려고하면로 .toString 및 Boolean.Parse이 Boolean b = Convert.ToBoolean(null)이 = 거짓 Convert.ToBoolean(Session["YourAssessment"])

B 않는의

if(Session["YourAssessment"] != null){ 
if (bool.Parse(Session["YourAssessment"].ToString()) == false && bool.Parse(Session["MyAssessment"].ToString()) == true) 
     { 
      Response.Redirect("~/myAssessment.aspx"); 
     } 
    } 
관련 문제