2012-05-10 78 views
6

一些我的aspx頁面的我檢查會話這樣爲什麼會話對象拋出一個空引用異常?

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

如果我繼續與頻繁的頁面打它工作正常,但如果我不爲5分鐘,頁面做任何事至少連,運行頁面引發錯誤

Object reference not set to an instance of an object. 

以下是堆棧這

[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 

可能身體有些解釋我這個怪異的行爲?

而且我們知道默認情況下會話的最後時間是20分鐘。

EDITED

見我有一個頁面默認的ASPX,它已經有一個按鈕,它修正了一些基礎上重定向到哪裏 在默認頁檢查它這樣

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

確定我的會話變爲空,但是如果它變爲null,我該做什麼操作? – NoviceToDotNet

+0

以及你可以做的最好的事情是把價值在會話;)只是開玩笑,你在哪裏設置會話變量,顯示你的代碼 –

回答

9

首先,您需要檢查會話變量是否存在

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

會發生這種情況,因爲你的會話有一個生命週期,這意味着 - 它到期(定義它的cookie到期) - 因此你的對象消失。您可以在web.config中增加sessionState timeout,以使會話持續更長時間。

例如,在web.config中

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

會讓你的會話持續40分鐘,只要客戶不將其清除,而web服務器是高達&運行。

+0

即使瀏覽器可以清除會話/ cookie。生活很難與瀏覽器合作。 – CodingBarfield

+0

@CodingBarfield,爲什麼我提到*只要客戶端不清除它* – Shai

+0

是的,我明白了,但在我的情況下,我清除session.abandon只註銷.. – NoviceToDotNet

1

首先,你可以用你像這樣的代碼

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

你確定你會話並不null

檢查這樣

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

但如何在5分鐘會話爲空 – NoviceToDotNet

+0

如果您使用即席會話,IIS上的工作進程重新啓動 –

+0

確定我的會話變爲空,但我應該做什麼行動,如果它變空? – NoviceToDotNet

1

如果Session不爲空,請重新檢查它是否有密鑰"YourAssessment""MyAssessment"

3

訪問Session對象時總是檢查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; 
    } 
} 

會話可以爲空,如果應用程序池被回收。這可能發生,因爲很多原因...

讓您的服務器免受會話丟失的一個訣竅是從JavaScript「服務」到服務器。它可以每隔一分鐘左右向一些虛擬url(空頁面,或者如果你完全錯誤地處理.ashx處理程序)發出請求。它對於長時間保持打開的頁面非常有用,如巨大的編輯表單。
另外,請注意,調試和發佈配置有不同的會話超時值!

1

當您的會話過期時,您在會話中放置的對象(如Session [「YourAssessment」])將變爲null,並且對這些對象的.toString()方法調用將引發Object引用錯誤。要解決這個問題,你必須首先檢查以確保你的會話變量在嘗試執行toString()之前爲空。

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

確定我的會話變爲空,但是如果它變爲null,我應該做什麼操作? – NoviceToDotNet

+0

對不起,我從來沒有看到你的問題通過。如果您的「您的評估」爲空,那麼您最好打賭是重定向到自定義錯誤頁面,並向用戶顯示錯誤,表明他們沒有選擇評估。在不知道應用程序的全部細節的情況下,很難說應該如何處理它,但所有應用程序都應該優雅地向用戶顯示錯誤。如果您不希望向用戶顯示特定錯誤,那麼在頁面本身上重定向或顯示一個錯誤,指出「出現錯誤」並將其記錄在某處有意義的地方。 – DRobertE

1

相反的的ToString和Boolean.Parse做Convert.ToBoolean(Session["YourAssessment"])

當我嘗試Boolean b = Convert.ToBoolean(null) B = FALSE;)

1

好後已寫入這一切似乎問題是IIS應用程序重新啓動以及會話是否存儲在可以刪除會話變量的proc中。所以嘗試登錄應用程序結束事件,看看是否是這樣的情況下,把這個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); 


} 
相關問題