Question

Je travaille dans un collège et je développe un site ASP.NET avec de très nombreux rapports sur les étudiants, les statistiques de fréquentation… La base des données est une base de données de serveur MSSQL, qui constitue la base de notre système de gestion des étudiants. . Cela a une période de maintenance régulière le jeudi matin pour une durée indéterminée (en fonction de ce qui doit être fait).

La plupart des employés sont conscients de cela, mais les utilisateurs moins habituels semblent m'appeler en permanence. Quel est le moyen le plus simple de désactiver le site pendant la maintenance, évidemment, je peux simplement essayer une requête de base de données pour vérifier si le site est actif, mais je ne suis pas sûr du meilleur moyen de rediriger, par exemple, tous les utilisateurs vers un site Web "Le site Web est en maintenance". message, sachant qu’ils auraient pu ouvrir une session avant la fermeture du site Web.

Espérons que quelque chose puisse être implémenté globalement plutôt que par page.

Était-ce utile?

La solution

Je suggérerais de le faire dans Application_PreRequestHandlerExecute au lieu d’après une erreur. Généralement, il serait préférable de ne pas entrer en traitement normal si vous savez que votre base de données n'est pas disponible. J'utilise généralement quelque chose comme ci-dessous

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

Autres conseils

Supprimez un fichier HTML appelé "app_offline.htm". dans la racine de votre répertoire virtuel. Aussi simple que cela.

Scott Guthrie sur le sujet et convivial erreurs.

Vous pouvez afficher un message à l'intention des personnes qui se sont connectées et qui ont indiqué que "le site sera arrêté pour maintenance dans xx minutes". puis exécutez un service pour déconnecter tout le monde après xxx minutes. Ensuite, définissez un indicateur à un endroit auquel chaque page peut accéder. En haut de chaque page (ou simplement de la page de modèle), vous testez si cet indicateur est défini. Si tel est le cas, envoyez un en-tête de redirection vers un site en panne pour la page de maintenance.

Que se passe-t-il maintenant lorsque le site est en panne et que quelqu'un essaie de le visiter? ADO.NET déclenche-t-il une exception spécifique que vous pourriez intercepter, puis rediriger vers le site Web "Site Web en panne"? page?

Vous pouvez ajouter un " Global.asax " fichier dans le projet et, dans son code-behind, ajoutez un " Application_Error " gestionnaire d'événements. Il se déclencherait chaque fois qu'une exception serait levée et resterait non capturée, de n'importe où dans votre application Web. Par exemple, en C #:

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

Vous pouvez également vérifier la propriété Number sur l'exception, bien que je ne sache pas quel numéro indiquerait l'impossibilité de se connecter au serveur de base de données. Vous pouvez tester ceci pendant qu’il est en panne, trouver le numéro de l’erreur SQL et le rechercher en ligne pour voir s’il s’agit précisément de ce que vous voulez vraiment vérifier.

EDIT: je vois ce que vous dites, petebob.

Le " offline.html " Cette page ne fonctionnera pas si l'utilisateur naviguait déjà sur le site ou s'il accédait au site à partir d'un signet / lien externe vers une page spécifique.

La solution que j’utilise consiste à créer un deuxième site Web avec la même adresse (en-tête (s) IP ou hôte), mais en le désactivant par défaut. Lorsque le site Web est en panne, un script désactive l'option "réel". site Web et permet la " maintenance " site à la place. Quand il revient en ligne, un autre script revient au mode "réel". site web.

Le " maintenance " le site Web se trouve dans un répertoire racine différent, avec une seule page contenant le message (et tous les fichiers images / css requis)

Pour que le même message soit affiché sur n’importe quelle page, le message "maintenance". Le site Web est configuré avec un gestionnaire d’erreurs 404 qui redirige toute demande vers le même "site Web arrêté pour maintenance". page.

Une version légèrement plus élégante de la vérification de base de données sur chaque page consisterait à effectuer la vérification dans le fichier Global.asax ou à créer une page maître dont toutes les autres pages héritent.

La suggestion d'avoir un site en ligne et un site hors connexion est vraiment bonne, mais elle ne s'applique vraiment que si vous avez un nombre limité de sites à gérer sur le serveur.

MODIFIER: Zut, les autres réponses à ces suggestions sont apparues après le chargement de la page. Je dois me rappeler d’actualiser avant de répondre:)

Le code James oublie de fermer la connexion, il devrait probablement être:

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

Merci pour les réponses reçues jusqu’à présent, je dois préciser que je ne suis pas celui qui effectue la maintenance et que j’ai toujours accès à IIS. De plus, je préfère les options où je ne fais rien car, comme tous les programmeurs, je suis un peu paresseux.

Je sais qu’un moyen est de vérifier un drapeau sur chaque page, mais j’espère pouvoir l’éviter. Ne pourrais-je pas faire quelque chose avec la page global.asax, en fait, je pense que l’affichage a mis mon cerveau en jeu:

Pensez que je pourrais mettre dans Application_BeginRequest un peu de code pour vérifier l'état SQL puis rediriger:

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

Ou quelque chose comme ça peut ne pas être parfait pas encore testé car je ne suis pas au travail. Commentaires appréciés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top