2009-02-17 7 views
0

Nous avons l'obligation de faire fermer automatiquement nos sites Web ASP.NET MVC par une notification à distance (modification de la valeur de la base de données). Où serait le meilleur endroit pour mettre en œuvre cela?Comment mieux implémenter la fonctionnalité 'site fermé'?

  • classe contrôleur base
  • Global.asax
  • attribut personnalisé
  • Autres

Mise à jour

Beaucoup de suggestions à utiliser app_offline mais ce scénario se passe tous les jours et sera purement initié par la base de données, donc je serais Pour que l'application prenne l'initiative plutôt que quelque chose d'externe, insérez le fichier.

De plus, je devrai probablement rediriger les utilisateurs vers une page d'attente (de préférence une méthode de contrôleur MVC pour que tout soit cohérent). Je me penche plus pour l'attraper dans mon BaseController et avoir cette poignée

+0

"ce scénario se produira tous les jours et sera purement initié par la base de données" à quelle vitesse le système doit-il répondre? Si, disons, une minute suffit, vous pouvez utiliser une tâche planifiée qui vérifie l'indicateur de base de données et crée/supprime le fichier app_offline. – Kristen

+0

Ou peut-être une autre partie de votre logique d'application normale (c'est-à-dire, lorsque vous obtenez d'autres données de base de données, mais quelque chose est fait fréquemment) pourrait le faire. Faire un appel de base de données aller-retour, par exemple, chaque rendu de page juste pour vérifier l'indicateur hors ligne peut nuire aux performances. – Kristen

Répondre

2

Je vais répondre moi-même comme je l'ai fait d'une manière différente mais merci à tous pour leurs réponses. Ce que j'ai fini par faire est de surcharger OnActionExecuting() dans ma classe BaseController (dont tous mes contrôleurs sont dérivés).

Dans cette méthode, je vérifie la base de données (en utilisant un cache de 1 minute) et si le site Web est fermé, je charge une vue pour afficher un message fermé. Code ci-dessous

Protected Overrides Sub OnActionExecuting(ByVal filterContext As System.Web.Mvc.ActionExecutingContext) 
      MyBase.OnActionExecuting(filterContext) 

      Dim _cfgService = ObjectFactory.GetInstance(Of IConfigService)() 

      If _cfgService.DynamicConfig.WebSiteClosed Then 
       filterContext.Result = ErrorHandler(_cfgService.DynamicConfig.WebSiteClosedTitle, _ 
                _cfgService.DynamicConfig.WebSiteClosedMessage) 
      End If 
     End Sub 
5

Je voudrais aller avec Global.asax Application_BeginRequest si vous devez le faire par programmation.

Vous pouvez Response.Redirect la page à "Offline.aspx" qui peut récupérer un message de la base de données ou tout ce dont vous avez besoin. Bien sûr, vous devriez regarder la demande pour voir si elle essayait d'obtenir "Offline.aspx" sinon vous finiriez dans une boucle infinie.

Ou peut-être que toutes vos applications peuvent être redirigées vers un site Web unique qui supprimerait la plupart des complications.

+0

La demande d'arrêt de l'application provient directement de la base de données, donc app_offline n'est pas vraiment une option. Application_BeginRequest semble être une bonne idée, mais je devrai probablement rediriger l'utilisateur vers une page de contrôleur avec un message, donc je ne suis pas sûr de la façon dont je vais gérer ce scénario – James

+0

Mise à jour de ma réponse avec une suggestion de programmation. –

+0

Un appel aller-retour DB dans Application_BeginRequest est-il vraiment une solution performante viable? Il me semble que sur un site occupé, il y a un surcoût supplémentaire qui n'a pas de valeur 99% du temps. Mieux vaut transmettre le changement d'état par d'autres moyens IMHO – Kristen

13

Il existe une manière standard de terminer "gracieusement" la webapp ASP.NET 2.0 - déposez simplement un App_Offline.htm dans le répertoire racine de votre application. Voir this.

+0

Pas toujours gracieux: http://stackoverflow.com/questions/373540/why-is-appoffline-failing-to-work-as-soon-as-you-it -starts-loading-dlls –

+0

Je me demande si Jeff (Atwood) a un commentaire à ce sujet car je sais que SO n'utilise pas la méthode app_offline.htm (il contient une image). –

-5

Désolé, je ne sais pas ASP.NET, mais si utile:

Nous avons une seule page APPLICATION.ASP pour notre site (CMS/Base de données de type substance de fusion); cela est peut-être pas commune et peut donc par conséquent de limiter l'utilité, mais il pourrait peut-être mis en œuvre par une inclusion au sommet de tous les fichiers ASPX

Nous renomme APPLICATION.ASP à test.asp et copier HOLDING_PAGE.ASP à APPLICATION.ASP

Le fichier HOLDING_PAGE.ASP est présent dans le dossier WWW, donc toujours prêt et disponible. Il contient un message "Site non disponible", etc. et est autonome pour tous les CSS (fichiers non inclus, pas d'accès DB). La seule exception est le logo de l'entreprise (qui est extérieur à ce fichier, évidemment)

Cette méthode empêche tout accès au site, ne dépend pas d'une connexion DB fonctionnelle, et nous permet de changer n'importe quoi sur le site sans interférer avec la page d'attente (en dehors de Logo de l'entreprise, mais changer qui est susceptible d'être bénigne)

Nous pouvons toujours accéder au site, en interne, en utilisant TEST.ASP - afin que nous puissions tester toutes les nouvelles fonctionnalités de déploiement avant de supprimer la page de garde et mettre le site en ligne. Si vous souhaitez empêcher l'utilisation anonyme de TEST.ASP, refusez l'autorisation anonyme.

Supprimer la page de garde est: Supprimer APPLICATION.ASP (c'est-à-dire la page d'attente) et Renommer TEST.ASP à APPLICATION.ASP

Nous avons également un indicateur de base de données qui provoque la page APPLICATION.ASP normale pour afficher une page de maintien - que nous pouvons utiliser tout en faisant des modifications plus mineures.

+0

Non, ce n'est pas une douleur dans le cul ou quoi que ce soit ... –

+0

Qu'est-ce pas une douleur dans le cul? Comme je l'ai dit je ne suis pas qualifié dans ASP.NET, me frappe cette suggestion est similaire à app_offline - il suffit de faire ces étapes par tâche planifiée, global.asax ou somesuch. Si les gens votaient contre, il serait utile qu'ils laissent un commentaire sur pourquoi. – Kristen

1

La manipulation de ce type de comportement dans le fichier Global.asax sonne comme la meilleure solution et la redirection vers une page statique « ofline/fermé ». Gérer la demande sur la méthode Application_BeginRequest, vérifiez que le site est actif, s'il le laisse continuer, s'il n'est pas en ligne Response.Redirect la demande à la page statique.

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    string redirectURL = "~/Offline.aspx"; //some static page 
    bool isOnline = false; //SQL Call, config value 

    if (!isOnline && !string.IsNullOrEmpty(redirectURL)) 
    { 
     Response.RedirectLocation = redirectURL; 
     Response.End(); 
    } 
} 
Questions connexes