Frage

ich an einem College arbeiten und haben eine ASP.NET-Website mit vielen, vielen Berichte über Schüler entwickelt, die Teilnahme stats ... Die Grundlage für die Daten ist ein MSSQL Server DB, die das hintere Ende unserer Schüler-Management-System ist . Dies hat eine regelmäßige Wartung Zeit am Donnerstagmorgen für eine unbekannte Zeitdauer (abhängig davon, was muss getan werden).

Die meisten Mitarbeiter wissen das, aber die weniger regelmäßigen Nutzer scheinen für immer zu sein, mich Klingeln auf. Was ist der einfachste Weg ist es, die Website während der Wartung deaktivieren offensichtlich kann ich nur eine DB-Abfrage versuchen zu testen, ob es nach oben ist, aber ich bin der beste Weg, um unsicher zum Beispiel alle Benutzer auf eine Umleitung „Die Website ist wegen Wartungsarbeiten“ -Meldung, wobei zu berücksichtigen ist sie eine Sitzung haben könnte, bevor die Website geht nach unten.

gestartet

Hoffentlich kann etwas global umgesetzt werden, anstatt pro Seite.

War es hilfreich?

Lösung

Ich würde vorschlagen, es in Application_PreRequestHandlerExecute tun statt, nachdem ein Fehler auftritt. Im Allgemeinen wäre es am besten, nicht die normale Verarbeitung eingeben, wenn Sie wissen, Ihre Datenbank nicht vorhanden ist. Ich in der Regel etwas verwenden, wie unten

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

Andere Tipps

Drop eine HTML-Datei „app_offline.htm“ in das Stammverzeichnis Ihres virtuellen Verzeichnisses. So einfach ist das.

Scott Guthrie zu diesem Thema und freundlich Fehler.

Sie können eine Mitteilung an Menschen zeigen, die in den Worten „die Website für die Wartung wird nach unten in xxx Minuten“ dann einen Dienst laufen alle einzuloggen nach xxx Minuten abgemeldet haben. Setzen Sie dann irgendwo ein Flag, dass jede Seite zugreifen kann, und oben auf jeder Seite (oder nur der Vorlagenseite) Sie testen, ob das Flag gesetzt ist, wenn es ist, eine Umleitung-Header auf eine Website senden ist zurzeit im Wartungs Seite.

Was jetzt geschieht, wenn die Seite nicht erreichbar ist und jemand versucht, es zu treffen? Hat ADO.NET eine spezifische Ausnahme werfen Sie fangen konnte und dann auf die „Website down“ Seite umleiten?

Sie könnten eine "Global.asax" Datei in das Projekt, und in seinem fügen Code-Behind fügen Sie einen "Application_Error" Event-Handler. Es wäre Feuer, wenn eine Ausnahme ausgelöst wird und geht von überall in Ihrer Web-App abgefangene. Zum Beispiel in C #:

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

Sie können auch die Nummer Eigenschaft auf Ausnahme überprüfen, obwohl ich nicht sicher bin, welche Nummer (n) würde bedeuten, es konnte keine Verbindung zum Datenbankserver verbinden. Man könnte dies testen, während es nach unten, die SQL-Fehlernummer finden und online nachschlagen, um zu sehen, ob es konkret, was Sie wirklich wollen, werden zu überprüfen.

EDIT: Ich sehe, was du sagst, petebob

.

Die „offline.html“ Seite wird nicht funktionieren, wenn der Benutzer bereits innerhalb der Website navigieren, oder ob er die Seite von einem Lesezeichen / externen Link auf eine bestimmte Seite zugegriffen wird.

Die Lösung ich benutze, ist eine zweite Website mit derselben Adresse (IP oder Host-Header (n)) zu schaffen, aber haben sie standardmäßig deaktiviert. Wenn die Website nicht erreichbar ist, deaktiviert ein Skript, um die „echte“ Website und ermöglicht die „Wartung“ Website statt. Wenn es wieder online geschaltet wird, schaltet sich ein anderes Skript, um die „echte“ Website wieder.

Die „Wartung“ Website in einem anderen Stammverzeichnis befindet, mit einer einzigen Seite mit der Meldung (und alle erforderlichen Bilder / CSS-Dateien)

Um die gleiche Nachricht auf jeder Seite angezeigt wird, haben die „Wartung“ Website wird mit einem 404-Fehler-Handler einrichten, die jede Anforderung an derselben umleitet „Website ist zurzeit im Wartungs“ Seite.

Eine etwas elegantere Version des DB-Check auf jeder Seite wäre die Prüfung in der Datei Global.asax zu tun oder eine Masterseite, die alle anderen Seiten von erben zu erstellen.

Der Vorschlag, ein Online-Portal und eine Offline-Website zu haben, ist wirklich gut, aber wirklich nur anwendbar, wenn Sie nur eine begrenzte Anzahl von Websites haben auf dem Server verwaltet werden.

EDIT: Verdammt, die anderen Antworten mit diesen Vorschlägen kam, nachdem ich die Seite geladen. Ich muss daran denken, bevor zu aktualisieren Antwort:)

James Code vergisst die Verbindung zu schließen, sollte wohl sein:

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

Danke für die Antworten so weit sollte ich, ich bin nicht derjenige, weisen darauf hin, dass die regelmäßigen Wartungsarbeiten noch tut Ich habe Zugang die ganze Zeit zu IIS. Auch ich ziehe Optionen, wo ich nichts tun, als wie alle Programmierer Ich bin ein bisschen faul.

Ich weiß, ein Weg ist, eine Flagge auf jeder Seite zu überprüfen, aber ich hoffe, es zu vermeiden. Kann ich nicht in der Tat etwas mit der global.asax Seite tun, denke ich Posting mein Gehirn beschäftigt hat:

Think I in Application_BeginRequest ein Stück Code setzen konnte den SQL-Status dann umleiten zu überprüfen:

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

Oder so ähnlich nicht perfekt sein kann, noch nicht geprüft, da ich nicht bei der Arbeit bin. Kommentare zu schätzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top