تعطيل (بأدب) موقع على شبكة الإنترنت عندما sql server دون اتصال

StackOverflow https://stackoverflow.com/questions/88775

  •  01-07-2019
  •  | 
  •  

سؤال

أنا أعمل في الجامعة و تم وضع ASP.NET الموقع مع العديد من, العديد من التقارير عن الطلاب الحضور احصائيات...أساس البيانات هو MSSQL server DB وهي النهاية الخلفية إلى نظام إدارة معلومات الطلبة.هذا وقد منتظم فترة الصيانة يوم الخميس الصباح مجهول طول الوقت (تعتمد على ما يمكن القيام به).

معظم الموظفين هم على بينة من هذا ولكن أقل من العادية المستخدمين على ما يبدو إلى الأبد رنين لي.ما هي أسهل طريقة لتعطيل الموقع أثناء الصيانة من الواضح أنني يمكن أن مجرد محاولة DB الاستعلام لاختبار ما إذا كان ذلك هو ما يصل ولكن أنا غير متأكد من الطريقة الأفضل على سبيل المثال إعادة توجيه كافة المستخدمين إلى "الموقع يخضع للصيانة" رسالة ، وإذ تضع في اعتبارها أنها قد بدأت الدورة قبل الموقع الذهاب إلى أسفل.

ونأمل أن شيئا يمكن تنفيذها على مستوى العالم وليس في كل صفحة.

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

المحلول

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

void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
 string sPage = Request.ServerVariables["SCRIPT_NAME"];
 if (!sPage.EndsWith("Maintenance.aspx", StringComparison.OrdinalIgnoreCase))
 {
  //test the database connection
  //if it fails then redirect the user to Maintenance.aspx
  string connStr = ConfigurationManager.ConnectionString["ConnectionString"].ConnectionString;
  SqlConnection conn = new SqlConnection(connStr);
  try
  {
   conn.Open();
  }
  catch(Exception ex)
  {
   Session["DBException"] = ex;
   Response.Redirect("Maintenance.aspx");
  }
  finally
  {
   conn.Close();
  }
 }
}

نصائح أخرى

وإسقاط ملف html يسمى "app_offline.htm" في جذر الدليل الظاهري.بسيطة على هذا النحو.

سكوت غوثري على الموضوع ودي الأخطاء.

يمكنك عرض رسالة إلى الناس الذين لديهم تسجيل في قوله "سوف يكون الموقع للصيانة في الثلاثين دقيقة" ثم تشغيل خدمة تسجيل الدخول من الجميع الخروج بعد الثلاثين دقيقة.ثم وضع العلم في مكان ما أن كل صفحة يمكن الوصول إليها في أعلى كل صفحة(أو مجرد صفحة القالب) يمكنك اختبار ما إذا كان هذا العلم هو مجموعة ، إذا كان إرسال توجيه رأس إلى الموقع يخضع للصيانة الصفحة.

ما يحدث الآن عند الموقع هو شخص يحاول ضرب ذلك ؟ لا ADO.NET رمي استثناء معين يمكن أن قبض ثم إعادة توجيه إلى "الموقع أسفل" الصفحة ؟

أنت يمكن أن تضيف "العالمية.asax" ملف المشروع في التعليمات البرمجية-خلف إضافة "Application_Error" معالج الحدث.ذلك أن النار كلما تم طرح استثناء ويذهب غير مسك ، من أي مكان في التطبيق الويب الخاص بك.على سبيل المثال ، في C#:

protected void Application_Error(object sender, EventArgs e)
{
    Exception e = Server.GetLastError().GetBaseException();
    if(e is SqlException)
    {    
        Server.ClearError();
        Server.Transfer("~/offline.aspx");
    }
} 

يمكنك أيضا التحقق من عدد الملكية على الاستثناء ، على الرغم من أنني لست متأكدا من أي عدد(s) تشير إلى أنه كان غير قادر على الاتصال إلى ملقم قاعدة البيانات.يمكنك اختبار هذا في حين أنه أسفل, العثور على خطأ SQL عدد والبحث عنه على الانترنت لمعرفة ما اذا كان هو على وجه التحديد ما كنت تريد حقا أن يكون التحقق.

تحرير: أرى ما تقوله ، petebob.

إن "offline.html" صفحة لن تعمل إذا كان المستخدم بالفعل التنقل داخل الموقع ، أو إذا كان الوصول إلى الموقع من المرجعية/رابط خارجي إلى صفحة محددة.

الحل الأول هو استخدام لإنشاء الثاني الموقع مع نفس العنوان (IP أو رأس المضيف(s)) ، ولكن قد تعطيل بشكل افتراضي.عندما الموقع هو أسفل, السيناريو يعطل "الحقيقي" على الويب و تمكن "الصيانة" على الانترنت بدلا من ذلك.عندما يتعلق الأمر مرة أخرى على الانترنت آخر النصي بالتبديل مرة أخرى إلى "الحقيقي" على الويب.

"الصيانة" الموقع يقع في الدليل الجذر ، مع صفحة واحدة مع الرسالة (أي مطلوب صور/ملفات css)

نفس الرسالة تظهر على أي صفحة ، "الصيانة" موقع ويب ذو 404 خطأ معالج توجيه أي طلب نفس "الموقع يخضع للصيانة" صفحة.

قليلا أكثر أناقة نسخة من DB تحقق في كل صفحة سيكون للقيام تحقق في العالمية.asax أو إنشاء صفحة رئيسية من أن كافة الصفحات الأخرى يرث.

اقتراح وجود موقع على الانترنت و حاليا الموقع هو جيد حقا, ولكن فقط تنطبق حقا إذا كان لديك عدد محدود من المواقع لإدارة على الملقم.

تحرير: اللعنة إجابات أخرى مع هذه الاقتراحات جاءت بعد تحميل الصفحة.أنا بحاجة إلى أن نتذكر أن التحديث قبل الرد :)

جيمس كود ينسى إغلاق الاتصال, ربما ينبغي أن يكون:

try
{
   conn.Open();
}
catch(Exception ex)
{
   Session["DBException"] = ex;
   Response.Redirect("Maintenance.aspx");
}
finally
{
   conn.Close();
}

شكرا على الردود حتى الآن وأود أن أشير إلى أنني لست الشخص الذي لا صيانة ولا يجب الدخول في كل وقت إلى IIS.أيضا, أنا أفضل الخيارات حيث لا كما مثل جميع المبرمجين أنا كسول بعض الشيء.

أنا أعرف طريقة واحدة للتحقق من العلم على كل صفحة ولكن أنا على أمل تجنب ذلك.يمكن أن لا تفعل شيئا مع العالمي.asax الصفحة, في الواقع, أعتقد نشر شاركت ذهني:

أعتقد أنني قد وضعت في Application_BeginRequest قليلا من التعليمات البرمجية للتحقق من SQL الدولة ثم إعادة توجيه:

HttpContext context = HttpContext.Current;
     if (!isOnline())
     {
        context.Response.ClearContent();
        context.Response.Write("<script language='javascript'>" + 
"top.location='" + Request.ApplicationPath + "/public/Offline.aspx';</scr" + "ipt>");
     } 

أو شيء من هذا القبيل قد لا تكون مثالية لم تختبر حتى الآن لست في العمل.تعليقات تقدير.

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