2012-05-10 16 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 मिनट है।

संपादित देखें मैं एक पेज डिफ़ॉल्ट 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

ठीक है मेरा सत्र शून्य हो रहा है, लेकिन अगर यह शून्य हो रहा है तो मैं क्या करता हूं? – 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

@ कोडिंगबर्फील्ड, मैंने क्यों उल्लेख किया है * जब तक ग्राहक इसे साफ़ नहीं करता है * – Shai

+0

हाँ मैं इसे समझता हूं, लेकिन मेरे मामले में मैंने इसे सत्र साफ़ कर दिया। केवल लॉग आउट पर बैंडन .. – 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 मिनट – NoviceToDotNet

+0

में सत्र कैसे शून्य हो सकता है, शायद आईआईएस पर कार्यकर्ता प्रक्रिया –

+0

ठीक है, मेरा सत्र शून्य हो रहा है, लेकिन अगर यह शून्य हो रहा है तो मैं क्या करता हूं? – NoviceToDotNet

1

यदि Session शून्य नहीं है, तो कृपया पुन: जांच करें कि इसकी कुंजी "YourAssessment" और "MyAssessment" है।

3

सत्र ऑब्जेक्ट तक पहुंचने पर हमेशा शून्य की जांच करें!
आप कुछ छोटे उपयोगिता है कि उस के लिए इस्तेमाल किया जा सकता लिख ​​सकते हैं:

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; 
    } 
} 

सत्र अशक्त हो सकता है यदि अनुप्रयोग पूल पुनर्नवीनीकरण है। ऐसा इसलिए हो सकता है क्योंकि कई कारण ...

अपने सर्वर को खोने से सत्र रखने के लिए एक चाल जावास्क्रिप्ट से सर्वर पर "पिंग्स" बना रही है। यह हर मिनट या उससे कुछ डमी यूआरएल (खाली पृष्ठ, या यदि आप perf freak, .ashx हैंडलर) के लिए अनुरोध कर सकते हैं। यह उन पृष्ठों के लिए उपयोगी हो सकता है जिन्हें आप लंबे समय तक खोलते रहते हैं, जैसे विशाल संपादन फॉर्म।
साथ ही, सावधान रहें, डीबग और रिलीज कॉन्फ़िगरेशन के लिए अलग-अलग सत्र टाइमआउट मान हैं!

1

जब आपका सत्र आपके सत्र में आपके द्वारा रखे गए ऑब्जेक्ट्स को समाप्त करता है जैसे सत्र ["आपका आकलन"] शून्य हो जाता है और उन ऑब्जेक्ट्स पर .toString() विधि कॉल तब ऑब्जेक्ट संदर्भ त्रुटि फेंक देगा। इसके आसपास काम करने के लिए आपको पहले यह सुनिश्चित करने के लिए जांच करनी होगी कि toString() को करने का प्रयास करने से पहले आपके सत्र चर शून्य हो जाएं।) ऐसा लगता है

+0

ठीक है मेरा सत्र शून्य हो रहा है, लेकिन अगर यह शून्य हो रहा है तो मैं क्या करता हूं? – NoviceToDotNet

+0

क्षमा करें, मैंने कभी आपका प्रश्न नहीं देखा है। यदि आप "आकलन" के लिए शून्य प्राप्त कर रहे हैं तो आप सबसे अच्छा शर्त कस्टम त्रुटि पृष्ठ पर रीडायरेक्ट करना और उपयोगकर्ता को एक त्रुटि प्रदर्शित करना है जो इंगित करता है कि उन्होंने मूल्यांकन नहीं चुना है। ऐप के पूर्ण विवरण जानने के बिना यह कहना मुश्किल है कि इसे निश्चित रूप से कैसे संभाला जाना चाहिए, लेकिन सभी अनुप्रयोगों को उपयोगकर्ता को त्रुटियों को शानदार ढंग से प्रदर्शित करना चाहिए। यदि आप उपयोगकर्ता को कोई विशिष्ट त्रुटि प्रदर्शित नहीं करना चाहते हैं तो पेज पर एक त्रुटि को रीडायरेक्ट या प्रदर्शित करें जो इंगित करता है कि "कोई त्रुटि हुई" और इसे कहीं भी सार्थक रूप से लॉग इन करें। – DRobertE

1
बजाय .ToString और Boolean.Parse करते Convert.ToBoolean(Session["YourAssessment"])

जब मैं कोशिश Boolean b = Convert.ToBoolean(null) ख = false

एप्लिकेशन पुनरारंभ करना और यदि आपका सत्र इनप्रोक संग्रहीत किया गया है जो सत्र चर के विलोपन को रोक सकता है। तो आवेदन अंत घटनाओं लॉग इन करें और देखें कि क्या यह एक मामला है करने के लिए प्रयास करते हैं, 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

खैर सब है कि इस बारे में लिखा गया है के बाद कि समस्या आईआईएस है,

if(Session["YourAssessment"] != null){ 
if (bool.Parse(Session["YourAssessment"].ToString()) == false && bool.Parse(Session["MyAssessment"].ToString()) == true) 
     { 
      Response.Redirect("~/myAssessment.aspx"); 
     } 
    } 
संबंधित मुद्दे