Domanda

Lavoro in un college e sto sviluppando un sito ASP.NET con molti, molti rapporti sugli studenti, statistiche sulle presenze...La base per i dati è un DB server MSSQL che costituisce il back-end del nostro sistema di gestione degli studenti.Questo ha un periodo di manutenzione regolare il giovedì mattina per un periodo di tempo sconosciuto (a seconda di cosa deve essere fatto).

La maggior parte dello staff ne è consapevole, ma gli utenti meno abituali sembrano chiamarmi continuamente.Qual è il modo più semplice per disabilitare il sito durante la manutenzione, ovviamente posso semplicemente provare una query DB per verificare se è attivo, ma non sono sicuro del modo migliore per reindirizzare, ad esempio, tutti gli utenti al messaggio "Il sito web è inattivo per manutenzione", tenendo presente che avrebbero potuto avviare una sessione prima che il sito Web non funzionasse.

Si spera che qualcosa possa essere implementato a livello globale anziché per pagina.

È stato utile?

Soluzione

Suggerirei di farlo in Application_PreRequestHandlerExecute invece che dopo che si è verificato un errore.In genere, sarebbe meglio non avviare l'elaborazione normale se sai che il tuo database non è disponibile.Di solito uso qualcosa come di seguito

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

Altri suggerimenti

Rilascia un file html chiamato "app_offline.htm" nella radice della tua directory virtuale.Semplice come quella.

Scott Guthrie sull'argomento ed errori amichevoli.

Potresti visualizzare un messaggio alle persone che hanno effettuato l'accesso dicendo "il sito sarà inattivo per manutenzione tra xxx minuti", quindi eseguire un servizio per disconnettere tutti dopo xxx minuti.Quindi imposta un flag da qualche parte a cui ogni pagina può accedere e nella parte superiore di ogni pagina (o solo della pagina del modello) verifica se quel flag è impostato, se lo è, invia un'intestazione di reindirizzamento a un sito non disponibile per la pagina di manutenzione.

Cosa succede ora quando il sito non è attivo e qualcuno tenta di colpirlo?ADO.NET genera un'eccezione specifica che potresti rilevare e quindi reindirizzare alla pagina "sito Web inattivo"?

Potresti aggiungere un file "Global.asax" al progetto e nel suo code-behind aggiungere un gestore eventi "Application_Error".Si attiva ogni volta che viene generata un'eccezione e non viene rilevata, da qualsiasi punto dell'app Web.Ad esempio, 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");
    }
} 

Potresti anche controllare la proprietà Number sull'eccezione, anche se non sono sicuro di quali numeri indicherebbero che non è stato possibile connettersi al server del database.Potresti testarlo mentre è inattivo, trovare il numero di errore SQL e cercarlo online per vedere se è specificamente ciò che vuoi veramente controllare.

MODIFICARE: Capisco quello che dici, petebob.

La pagina "offline.html" non funzionerà se l'utente stava già navigando all'interno del sito, o se sta accedendo al sito da un segnalibro/link esterno ad una pagina specifica.

La soluzione che utilizzo è creare un secondo sito Web con lo stesso indirizzo (IP o intestazione/i host), ma disabilitarlo per impostazione predefinita.Quando il sito web non è disponibile, uno script disattiva il sito web "reale" e abilita invece il sito web di "manutenzione".Quando torna online, un altro script torna al sito web "reale".

Il sito web di "manutenzione" si trova in una directory root diversa, con un'unica pagina con il messaggio (ed eventuali file immagine/css richiesti)

Per visualizzare lo stesso messaggio su qualsiasi pagina, il sito Web di "manutenzione" è configurato con un gestore di errori 404 che reindirizzerà qualsiasi richiesta alla stessa pagina "Sito Web non disponibile per manutenzione".

Una versione leggermente più elegante del controllo DB su ogni pagina consiste nell'eseguire il controllo nel file Global.asax o nel creare una pagina master da cui ereditano tutte le altre pagine.

Il suggerimento di avere un sito online e uno offline è davvero valido, ma realmente applicabile solo se si ha un numero limitato di siti da gestire sul server.

MODIFICARE: Accidenti, le altre risposte con questi suggerimenti sono arrivate dopo aver caricato la pagina.Devo ricordarmi di aggiornare prima di rispondere :)

Il codice James dimentica di chiudere la connessione, probabilmente dovrebbe essere:

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

Grazie per le risposte finora. Dovrei sottolineare che non sono io quello che si occupa della manutenzione né ho sempre accesso a IIS.Inoltre, preferisco le opzioni in cui non faccio nulla poiché, come tutti i programmatori, sono un po' pigro.

So che un modo è controllare un flag su ogni pagina, ma spero di evitarlo.Potrei non fare qualcosa con la pagina global.asax, infatti, penso che pubblicare abbia impegnato il mio cervello:

Penso che potrei inserire in Application_BeginRequest un po' di codice per controllare lo stato SQL e poi reindirizzare:

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

Oppure qualcosa del genere potrebbe non essere perfetto, non ancora testato perché non sono al lavoro.Commenti apprezzati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top