سؤال

لقد صنعت شيئًا مثل الكود التالي:

protected void Page_Load(object sender, EventArgs e)
{
   Label1.Text = Session["loginid"].ToString();
}

protected void delete_click(object sender, EventArgs e)
{
    delete("mail1",Session["loginid"]);
}

private int delete(string mailid, string user)
{
 System.IO.Directory.Delete(Server.MapPath(@"~\files\" + user + @"\" + mailid), true);
}

عندما أضغط على زر الحذف ، يعمل كل شيء بشكل جيد ويتم حذف المجلد. ولكن بعد ذلك عندما يتم نشر postback مرة أخرى ، يتم رفع nullrefrenceexception في label1.text = session ["loginid"]. toString () ؛

لماذا يحدث ... ؟؟

عندما لا أستخدم هذا الدليل. delete () طريقة كل شيء يعمل بشكل جيد ولا يتم ضبط متغيرات الجلسة على NULL.

عندما تتبعت طلبي ، وجدت أنه بعد الدليل.

ولكن بمجرد أن تنشر الصفحة جميع متغيرات الجلسة على NULL. وهذه المشكلة لا تظهر عندما لا أستخدم طريقة DELETE ().

المجلد الذي أحذفه في مجلد مشروعي. أنا أقوم بتشغيل هذا الموقع باستخدام Visual Studio.

الرجاء المساعدة.

هل كانت مفيدة؟

المحلول

مجرد تخمين آخر هنا ولكن ربما يكون ذلك بسبب تعديل شيء ما في دليل التطبيقات الخاصة بك (حدس منذ استخدامك Server.MapPath مع ال ~). ربما يعتقد IIs أن التطبيق قد تغير ويعيد تدوير التطبيق ونتيجة لذلك يمنح جميع الجلسات.

هذا مشابه لما إذا قمت بتعديل ملف الويب الخاص بك. هل تقوم بحذف دليل قد يحتوي على معلومات تستخدمها IIS للتطبيق؟

قلت إن ذلك يحدث فقط عندما تقوم بتضمين خط الكود هذا وسيتم القضاء على الجلسة فقط باستمرار (إلا إذا كنت تفعل ذلك بنفسك يدويًا) عند إعادة تدوير التطبيق بواسطة IIS أو Times Out. من الواضح أنه ليس توقيتًا ، لذا يجب أن تكون إعادة التدوير هي ما يحدث.

نصائح أخرى

هل مجلد "الملفات" الخاص بك في مجلد تطبيق الويب الخاص بك؟ ربما يعيد التطبيق إعادة تشغيل نفسه عند حذف الملفات. حاول استخدام SessionStateserver. لها جلسات الحفاظ على قيد الحياة.

web.config:

<configuration>
    <system.web>
        <sessionState mode="StateServer"></sessionState>
    </system.web>
</configuration>

قد يؤدي حذف مجلد في الدليل الافتراضي إلى إعادة بدء تطبيقك ، وبالتالي فقدان جميع بيانات الجلسة. لمنع ذلك ، إما حذف الملفات الفردية (وليس المجلدات) أو استخدام مستخدم الولايات للحفاظ على جلساتك.

نظرًا لأن الصفحة يتم تحميلها بشكل صحيح قبل الضغط على زر الحذف ، فمن المفترض أن تكون المشكلة مع Session["loginid"].ToString() المرجعي. هل لديك أي رمز آخر يشير إلى Session["loginid"]؟ الكود الذي أظهرته هنا لن يفعل أي شيء يزيل loginid من الجلسة.

ومع ذلك ، إذا كان هذا التطبيق يعمل على مجموعة خادم وكنت تستخدم وضع الجلسة الافتراضي للعملية ، فقد تفقد الوصول إلى جلستك بين طلبات HTTP لأنها معالجة بواسطة خوادم مختلفة. يرى هنا للمزيد من المعلومات.

إذا قمت بإزالة الدليل.

حسنًا ، يبدو أننا وجدنا مشكلتك. لا يحتوي مشروعك على الامتيازات اللازمة لحذف direcotry (حتى لو تم حذف الدليل. ومع ذلك: هناك مشاكل امتياز)

أعتقد أن التطبيق الخاص بك هو رمي استثناء أثناء إجراء عملية الملف وتبدأ جلسة جديدة. لديّ موقف مشترك في أحد مشاريعي ، لكنني ما زلت لم أحسب كيفية حلها.

أنا متأكد من أنك سوف تتفق مع الوصف إذا قمت بإنشاء Global.asax وضبط نقاط التوقف على application_onerror و Session_onstart (أو مع ذلك يتم تهجئة هذه الطرق بشكل صحيح). سترى أن الخطأ قد أثير وبعد ذلك يتم بدء جلسة جديدة.

أولا ، اثنين من الشيكات العقلانية:

  1. هل تعمل الجلسة كما هو متوقع في الصفحات الأخرى؟
  2. هل طريقة حذفك لحذف الملفات في مجلد خاص ASP.NET ، مثل App_Data أو App_Code ، والذي قد يتسبب في إعادة تشغيل التطبيق؟

إليك ما سأحاول تصحيح هذه المشكلة ، بعد التحقق من ما سبق:

  1. اضبط نقطة توقف على طريقة الحذف واحصل على متغير الجلسة في نافذة ساعة. تعرف على قيمة متغير الجلسة قبل الاتصال إلى الدليل. هل هو في هذه المرحلة عندما تخسر جلسة ، أم لا حتى زيارة الصفحة التالية؟
  2. استخدم أداة مثل Fiddler لفحص ملفات تعريف الارتباط التي تم تبادلها بين المتصفح وخادم الويب على Postbacks. تحقق من أنه عندما يزور المتصفح لأول مرة إنشاء ملف تعريف ارتباط جلسة جديدة وتخزينها على المتصفح. ثم ، عند حذف المجلد ، تعرف على ما إذا كان خادم الويب يرسل الجديد ملف تعريف الارتباط جلسة على استجابة هذا البريد. هذا سيشير إلى أنه تم إنشاء جلسة جديدة.

شكرًا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top