32 votes

Arrêter/redémarrer automatiquement le serveur de développement ASP.NET lors de la construction.

Existe-t-il un moyen d'arrêter automatiquement le serveur de développement ASP.NET (Cassini) chaque fois que je fais une construction/reconstruction dans VS2008 (et de le faire redémarrer si nécessaire) ? Peut-être existe-t-il un paramètre de configuration caché quelque part ? Ou au moins un moyen de le faire comme un événement post-build peut-être ?

Le problème est que j'utilise Spring.NET pour l'injection de dépendances, etc., mais il charge ses singletons au démarrage de l'application, ce qui signifie que si je modifie un code/une configuration lié(e) à Spring, je dois arrêter le serveur de développement pour qu'il redémarre au prochain débogage/exécution en s'assurant que l'événement de démarrage de l'application est à nouveau déclenché. En d'autres termes, même si vous modifiez un tas de code/configuration et que vous recommencez à déboguer, cela ne fait pas vraiment de différence. commencer encore une fois, puisque c'est déjà en cours d'exécution, donc votre nouveau code n'est pas utilisé.

23voto

mat3 Points 529

Solution : Débogage de Global.aspx.cs Application_Start() avec le serveur Web ASP.Net dans Visual Studio

L'activation de "Edit & Continue" sur le projet de serveur web a fonctionné pour moi. Cela n'arrête pas cassini lorsque vous arrêtez le débogage, mais cela redémarre cassini lorsque vous commencez le débogage.

9voto

Alconja Points 10626

J'ai donc fini par trouver une solution de contournement basée sur la réponse de Magnus, mais en utilisant la macro relativement simple suivante (pourquoi vous obligent-ils à utiliser VB pour les macros ? je me sens tout sale) :

Imports System
Imports System.Diagnostics

Public Module KillCassini

    Sub RestartDebug()
        If (DTE.Debugger.DebuggedProcesses.Count > 0) Then
            DTE.Debugger.Stop(True)
        End If
        KillCassini()
        DTE.Debugger.Go(False)
    End Sub

    Sub KillCassini()
        Dim name As String = "WebDev.WebServer"
        Dim proc As Process
        For Each proc In Process.GetProcesses
            If (proc.ProcessName.StartsWith(name)) Then
                proc.Kill()
            End If
        Next
    End Sub

End Module

En fait, si le débogueur est en cours d'exécution, il l'arrête et tue tous les processus nommés "WebDev.WebServer", qui devraient être toutes les instances de Cassini, puis relance le débogueur (ce qui relance implicitement Cassini). J'utilise proc.Kill() parce que ni l'un ni l'autre proc.CloseMainWindow() o proc.WaitForExit(1000) semblait fonctionner...

Quoi qu'il en soit, une fois que vous avez votre macro, vous pouvez l'affecter à des raccourcis clavier ou créer des boutons de barre d'outils personnalisés pour l'exécuter.

9voto

wlopez Points 51

Je viens d'ouvrir une ligne de commande (runas admin)

exécuter ce qui suit. Cela devrait tous les tuer

Taskkill /IM WebDev.WebServer40.EXE /F

7voto

Magnus Points 15064

Le seul moyen que je connaisse est de faire un démarrage personnalisé de Cassini sur l'événement post.build. Ce processus personnalisé tue toutes les instances de Cassini, et en démarre une nouvelle. Afin que cela fonctionne, vous aurez besoin de construire un petit utilitaire de ligne de commande personnalisé. Je l'ai appelé SpawnProcess ici.

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Diagnostics;

namespace SpawnProc
{
  class Program
  {
    public static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        // Kill all current instances
        FileInfo fi = new FileInfo(args[0]);
        string name = Path.GetFileNameWithoutExtension(fi.FullName);
        foreach (Process proc in Process.GetProcessesByName(name))
        {
          proc.Kill();
        }

        ProcessStartInfo startInfo = new ProcessStartInfo(args[0]);
        if (args.Length > 1)
        {
          startInfo.Arguments += "/port:" + args[1];
        }

        if (args.Length > 2)
        {
          startInfo.Arguments += " /path:\"" + args[2].Trim(new char[]{'"'}) + "\"";
        }
        if (args.Length > 3)
        {
          startInfo.Arguments += " /vpath:\"" + args[3].Trim(new char[]{'"'}) + "\"";
        }

        try
        {
          Process.Start(startInfo);
        }
        catch (Exception ex)
        {
          Debug.WriteLine("Error: " + ex.Message);
          for (int i = 0; i < args.Length; i++)
          {
            Debug.WriteLine("args[" + i + "]: " + args[i].ToString());
          }
        }
      }
    }
  }
}

Vous devrez alors demander à Visual Studio de ne pas utiliser Cassini. Allez dans les propriétés de votre application web -> Web et sélectionnez "Use Custom Web Server", entrez quelque chose comme : http://localhost:1685/ (ou tout autre numéro de port que vous souhaitez utiliser). Ensuite, entrez cette commande dans l'événement post-construction :

"$(ProjectDir)..\SpawnProc\bin\debug\SpawnProc" "C:\Program Files (x86)\Common Files\microsoft shared\DevServer\9.0\WebDev.WebServer.exe" 1685 "$(ProjectDir)" /

Assurez-vous que vos chemins d'accès sont corrects, par exemple, puisque j'utilise un système d'exploitation 64 bits, le chemin d'accès à mes fichiers de programmes est différent de celui d'un système d'exploitation 32 bits. De plus, mon SpawnProc.exe est dans un sous-projet.

5voto

Yahoo Serious Points 964

Inspiré par ce post et un autre à propos du nettoyage du code J'ai ajouté la macro comme PostDebug-event. Ainsi, chaque fois que le débogueur revient, il supprime tous les WebDev.WebServer-s. (Et j'ai relâché la contrainte du ProcessName).

Note : cela va probablement tuer tous les WebServers, donc aussi les WebServers des autres sessions de débogage (ce qui me convient, en ce moment, je n'en ai généralement pas). Vous pouvez donc vouloir ne rechercher que les processus enfants ou quelque chose comme ça (et poster ce code ici ;-) ).

Mon code ressemble donc à ceci :

Private Sub DebuggerEvents_OnEnterDesignMode(ByVal Reason As EnvDTE.dbgEventReason) _
            Handles DebuggerEvents.OnEnterDesignMode
    If (Reason = dbgEventReason.dbgEventReasonStopDebugging) Then
        Dim name As String = "WebDev.WebServer"
        Dim proc As System.Diagnostics.Process
        For Each proc In System.Diagnostics.Process.GetProcesses()
            If (proc.ProcessName.StartsWith(name)) Then
                proc.Kill()
            End If
        Next
    End If
End Sub

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X