2017-09-21 6 views
1

Je suis en train de réaliser ce qui suit pour mon asp.net application MVC hébergé dans IIS 8.5:application asp.net ne démarre pas automatiquement

  • Lorsque le serveur démarre, l'application doit être démarré automatiquement
  • L'application ne doit pas être interrompue pour cette raison
  • L'application doit être redémarré une fois par jour à une heure

spécifié Voici ma configuration actuelle dans IIS:

  • Piscine App:
    • Start Mode = AlwaysRunning
    • délai d'inactivité = 0
    • Désactiver chevauchée recyclage = True (ne fonctionne pas avec "Faux" non plus)
    • Recyclage/spécifique temps = 03:00:00
  • site:
    • préchargement Activé = True

Mon problème est que l'application est fermée très bien à l'heure indiquée (je fais des tests en ajoutant une autre entrée à quelques minutes à l'avenir), mais il n » t redémarrer après cela, que j'ai vérifié à la fois dans le journal (Application_Start ne fonctionne pas) et avec le temps de démarrage long pour la première demande (environ 15s alors que les demandes suivantes sont d'environ 0,07s).

Est-ce que je fais quelque chose de mal, ou est-ce que IIS est simplement incapable de démarrer automatiquement mon application?

+0

Quelle version d'ASP.Net utilisez-vous? Les paramètres que vous avez configurés devraient fonctionner correctement pour démarrer l'application après un recyclage: https://weblogs.asp.net/scottgu/auto-start-asp-net-applications-vs-2010-and-net-4- 0-series –

+0

@ TomJohn J'utilise .net framework 4.6.1 avec asp.net MVC 5.2.3. J'ai vu le blog que vous avez référencé après avoir posté la question, et je confirme qu'il ne fonctionne pas, à moins que vous n'ajoutitiez réellement la classe "PreWarmCache" et que vous fassiez ce qu'il faut pour éveiller l'application web. Donc le post me semble incomplet, c'est * pas * lancer Application_Start out-of-the-box (mais dites-moi si je fais quelque chose de mal!) J'expérimente actuellement, il semble fonctionner si vous ajoutez un peu plus de code, mais j'essaie de trouver le moyen le plus propre de le faire avant d'afficher une réponse. – youen

+0

J'ai également essayé avec https://github.com/Fody/ModuleInit d'exécuter du code lorsque la DLL de mon application est chargée; il s'avère que le code * est * exécuté, mais * pas * jusqu'à ce que j'envoie la première requête à l'application web. Donc c'est une impasse. C'est toujours intéressant car cela prouve que malgré la configuration d'IIS qui vous ferait penser qu'il est supposé faire * quelque chose *, il ne charge même pas votre DLL! – youen

Répondre

0

Après avoir essayé avec différents paramètres, il se trouve IIS ne jamais charger votre DLL d'application jusqu'à ce que la première demande, à moins que vous donnez une classe serviceAutoStartProvider, comme expliqué dans https://weblogs.asp.net/scottgu/auto-start-asp-net-applications-vs-2010-and-net-4-0-series

Vous devez configurer IIS comme ceci:

  • piscine App:
    • Start Mode = AlwaysRunning
    • Time-out = 0 inactif
    • Désactiver chevauchée recyclage = True (non requis si votre application permet à plusieurs instances simultanées)
    • Recyclage/spécifiques Temps = 03:00:00 (ce qui est juste un exemple, il redémarre l'application tous les jours à l'heure spécifiée)

Vous devez également modifier le fichier C:\Windows\System32\inetsrv\config\applicationHost.config (uniquement t il les parties pertinentes sont présentées ici):

<configuration> 
    <system.applicationHost> 
    <sites> 
     <site name="your site name" serverAutoStart="true"> 
     <application [...] serviceAutoStartEnabled="true" serviceAutoStartProvider="WarmUp"> 
     </application> 
     </site> 
    </sites> 

    <serviceAutoStartProviders> 
     <add name="WarmUp" type="WarmUp, YourApplicationDLL" /> 
    </serviceAutoStartProviders> 
    </system.applicationHost> 
</configuration> 

Ensuite, vous devez ajouter une classe dans votre DLL d'application:

public class WarmUp : System.Web.Hosting.IProcessHostPreloadClient 
{ 
    public void Preload(string[] parameters) 
    { 
     // This is the entry point, but your website is not serving 
     // pages yet here, so we can't send requests yet. Instead we 
     // start a new thread and return immediately. You could add 
     // initialization code that must run before serving any request. 
     new Thread(DoWarmUp).Start(); 
    } 

    private static void DoWarmUp() 
    { 
     // Here we just send a request to the home page to preload it. 
     // This will run Application_Start, and compile .cshtml files 
     // if you use Razor ; you may want to add more pages to preload 
     using (var client = new WebClient()) 
     { 
      client.DownloadData("http://localhost/MyHomePageIWantToPreload"); 
     } 
    } 
} 

Et que c'est, maintenant votre application web est en fait prêt à servir la page d'accueil sans tout délai supplémentaire. Si vous souhaitez précharger des éléments spécifiques dans votre application, vous pouvez ajouter plus de code d'initialisation au DoWarmUp.

2

Je ne crois pas que les applications/sites IIS puissent redémarrer eux-mêmes. J'ai examiné plusieurs fois au cours des années le moyen le plus fiable d'y parvenir est à travers des tâches planifiées pour appeler une page et maintenir le site en vie.

Ce fichier script.vbs vous pouvez appeler à partir d'une tâche planifiée:

Option Explicit 
Dim url, xmlhttp 

Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP") 
url = "http://example.com/page" 
xmlhttp.open "GET", url, 0 
xmlhttp.send "" 

Set xmlhttp = Nothing 
+0

Merci. Evidemment ce n'est pas une réponse que j'aime ;-) Mais peut-être que c'est en effet le seul moyen. Je vais attendre un peu pour voir si quelqu'un d'autre a un meilleur moyen, sinon j'accepterai le vôtre dans quelques jours. – youen

+0

Aucun problème. Il y a d'autres options possibles, mais nous avons toujours eu un environnement très limité (l'hébergement) et ceux-ci nécessitent un accès limité à diverses choses sur le système. –

+0

J'ai modifié votre réponse car elle fonctionne, même si elle ne fait que précharger des éléments lorsque la tâche planifiée s'exécute. Ainsi, vous envoyez trop de requêtes si vous la mettez à jour fréquemment ou vous ne parvenez pas à redémarrer l'application. rarement. Pourtant, il est sans doute plus simple que ma réponse lorsque vous avez accès à des tâches planifiées. À moins que quelqu'un ne trouve une meilleure solution, j'accepterai ma réponse. – youen