web-dev-qa-db-fra.com

Arrêter/redémarrer automatiquement le serveur de développement ASP.NET à la génération

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

Le problème, c’est que j’utilise Spring.NET pour l’injection de dépendances, etc., mais il charge ses singletons au démarrage d’application, ce qui signifie que si je modifie un code/une configuration lié à un ressort, je dois arrêter le serveur de développement. qu'il recommence le prochain débogage/exécution en s'assurant que l'événement Application Start est à nouveau déclenché. En d’autres termes, même si vous modifiez un lot de code/config et relancez ensuite le débogage, il ne redémarre pas en fait start , car il est déjà en cours d’exécution, votre nouveau code n’est donc pas utilisé.

32
Alconja

Je me suis donc retrouvé avec 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

Fondamentalement, si le débogueur est en cours d’exécution, il l’arrête et supprime tous les processus nommés "WebDev.WebServer" qui doivent contenir toutes les instances de Cassini, puis relance le débogueur (qui redémarre implicitement Cassini). J'utilise proc.Kill() car ni proc.CloseMainWindow() ni proc.WaitForExit(1000) n'a semblé fonctionner ...

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

9
Alconja

Solution de contournement: 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. Il n'arrête pas Cassini lorsque vous arrêtez le débogage, mais redémarre Cassini lorsque vous démarrez le débogage.

23
mat3

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

exécutez ce qui suit. Ça devrait tous les tuer

Taskkill /IM WebDev.WebServer40.EXE /F
9
wlopez

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. Pour que cela fonctionne, vous devrez créer 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());
          }
        }
      }
    }
  }
}

Ensuite, vous devrez indiquer à Visual Studio de ne pas utiliser Cassini. Accédez aux propriétés de votre application Web -> Web et sélectionnez "Utiliser un serveur Web personnalisé", entrez le code suivant: http://localhost:1685/ (ou le numéro de port que vous souhaitez utiliser). Entrez ensuite cette commande dans le champ événement de 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 sont corrects, par exemple, puisque j'utilise un système d'exploitation 64 bits, le chemin d'accès aux fichiers de programme est différent d'un système d'exploitation 32 bits. En outre, mon SpawnProc.exe est dans un sous-projet.

7
Magnus Johansson

Inspiré par ce message et par un autre sur le nettoyage du code , J'ai ajouté la macro en tant que PostDebug-event. Ainsi, chaque fois que le débogueur reviendra, il supprimera tous les WebDev.WebServer-s. (Et j'ai relâché la contrainte ProcessName.)

Note: cela va probablement tuer all les WebServers, donc aussi les WebServers des autres sessions de débogage (ce qui me convient, pour le moment, je n'en ai généralement pas). Donc, vous voudrez peut-être ne rechercher que des processus enfants ou quelque chose du genre (et poster ce code ici ;-)).

Donc, mon code ressemble à 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
5
Yahoo Serious

Une autre façon utilise Powershell:

PS: Je ne sais pas si quelqu'un a encore besoin d'aide, mais je suis tombé par hasard sur cette solution en cherchant quelque chose de complètement différent.

0
Yahoo Serious