Detener/reiniciar automáticamente el servidor de desarrollo ASP.NET en compilación
visual-studio cassini (6)
Acabo de abrir una línea de comando (administrador de runas)
ejecuta lo siguiente. Debería matarlos a todos
Taskkill /IM WebDev.WebServer40.EXE /F
¿Hay alguna manera de detener automáticamente el servidor de desarrollo ASP.NET (Cassini) cada vez que hago una compilación / reconstrucción en VS2008 (y luego, obviamente, tengo que comenzar de nuevo cuando sea necesario)? Tal vez hay algún ajuste de configuración oculta en alguna parte? ¿O al menos alguna forma de hacerlo como un evento de construcción posterior tal vez?
Para algunos antecedentes, el problema es que estoy usando Spring.NET para inyección de dependencias, etc., pero carga sus singletons en Application Start, lo que significa que si cambio cualquier código / configuración relacionada con la primavera, tengo que detener el servidor de desarrollo, por lo que que comienza de nuevo la próxima depuración / ejecución asegurando que el evento de Inicio de la aplicación se active nuevamente. En otras palabras, incluso si cambia un montón de código / config y luego comienza a depurar de nuevo, en realidad no se inicia de nuevo, ya que se está ejecutando, por lo que su nuevo código no se está utilizando.
Así que terminé con una solución basada en la respuesta de Magnus, pero usando la siguiente macro relativamente simple (¿por qué te obligan a usar VB para macros? Me siento todo sucio):
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
Básicamente, si el depurador se está ejecutando actualmente, lo detendrá y luego eliminará cualquier proceso llamado "WebDev.WebServer", que debería ser todas las instancias de Cassini y luego iniciará el depurador nuevamente (lo que iniciará de forma implícita a Cassini nuevamente). Estoy usando proc.Kill()
porque ni proc.CloseMainWindow()
ni proc.WaitForExit(1000)
parecían funcionar ...
De todos modos, una vez que tenga su macro, puede asignarla a accesos directos de teclado, o crear botones personalizados de la barra de herramientas para ejecutarla.
Inspirado por esta publicación y otro sobre la limpieza de código , agregué la macro como PostDebug-event. Por lo tanto, cada vez que el depurador regrese, eliminará todos los WebDev.WebServer-s. (Y relajé ProcessName-constraint).
Nota: esto probablemente matará a todos los Servidores Web, por lo que también Servidores Web de otras sesiones de depuración (lo cual está bien conmigo, en este momento, generalmente no tengo ninguno). Por lo tanto, es posible que solo desee buscar procesos secundarios o algo así (y publicar ese código aquí ;-)).
Entonces mi código se ve así:
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
La única forma que conozco es hacer un inicio personalizado de Cassini en el evento post.build. Este proceso personalizado elimina todas las instancias de Cassini e inicia una nueva. Para que esto funcione, deberá construir una pequeña utilidad de línea de comandos personalizada. Lo he llamado SpawnProcess aquí.
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());
}
}
}
}
}
}
Luego, instruirá a Visual Studio para que no use Cassini. Llegué a las propiedades para su aplicación web -> Web y selecciono "Usar servidor web personalizado", ingrese algo como: http://localhost:1685/
(O el número de puerto que quiera usar). Luego, ingrese este comando en el evento posterior a la construcción:
"$(ProjectDir)../SpawnProc/bin/debug/SpawnProc" "C:/Program Files (x86)/Common Files/microsoft shared/DevServer/9.0/WebDev.WebServer.exe" 1685 "$(ProjectDir)" /
Asegúrese de que sus rutas sean correctas, por ejemplo, dado que estoy ejecutando un sistema operativo de 64 bits, la ruta de los archivos de mi programa es diferente de la de un sistema operativo de 32 bits. Además, mi SpawnProc.exe está en un proyecto secundario.
Otra forma es usar Powershell:
- como pre-build-event :
powershell Stop-Process -name webdev.webserver
- como Powershell-command-shortcut :
powershell.exe Stop-Process -Name @(''WebDev.WebServer*'', ''Microsoft.Expression.Web*'')
PD: No sé si alguien todavía está necesitado, pero me encontré por casualidad con esta solución, mientras buscaba algo completamente diferente.
Permitir "Editar y continuar" en el proyecto del servidor web funcionó para mí. No detiene el cassini cuando detiene la depuración, pero reinicia cassini cuando comienza la depuración.