2009-05-20 19 views
32

¿Hay alguna forma 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, reinicio 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?Detener/reiniciar automáticamente Servidor de desarrollo ASP.NET en compilación

Para algunos antecedentes, el problema es que estoy usando Spring.NET para la inyección de dependencias, etc., pero carga sus singletons en el Inicio de la aplicación, lo que significa que si cambio algún código/configuración relacionado con la primavera, tengo que detener el Development Server, para que comience nuevamente la depuración/ejecución asegurando que el evento Application Start se active nuevamente. En otras palabras, incluso si cambia un montón de code/config & y luego comienza la depuración de nuevo, en realidad no comienza, ya que se está ejecutando, por lo que su nuevo código no se está utilizando.

+0

Me gustaría saber por qué lo necesita sin ese fondo que proporcionó. :) No puedo ayudar de todos modos. –

+1

Tengo el mismo deseo pero un problema muy diferente. Mi aplicación web tiene dependencias nativas (controladores de base de datos) y nuestra compilación las copia en el directorio de salida. (Los contenedores .NET alrededor de los controladores tienen enlaces estáticos a los archivos DLL nativos, lo que nos permite colocarlos en el directorio 'bin'. Confíe en mí. Es una solución mucho mejor que intentar instalar el cliente Oracle). Desafortunadamente, el servidor de desarrollo contiene bloquea las DLL nativas, por lo que copiarlas falla durante la compilación. Es muy frustrante tener que detener manualmente el servidor web cada vez que necesito reconstruirlo. – jpmc26

Respuesta

9

así que terminé con una sede fuera respuesta de Magnus solución, pero usando la siguiente macro relativamente simple (¿por qué te obligan a utilizar VB para las macros me siento 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 matará cualquier proceso llamado "WebDev.WebServer" que debería ser todas las instancias de Cassini y luego iniciará el depurador de nuevo (lo que iniciará de forma implícita a Cassini nuevamente). Estoy usando proc.Kill() porque ni proc.CloseMainWindow() o proc.WaitForExit(1000) parecía funcionar ...

De todos modos, una vez que tienes la macro se puede asignar a los atajos de teclado, o crear botones de barra de herramientas personalizada para ejecutarlo.

+0

Nota: modificado por un editor anónimo para cambiar 'proc.ProcessName = name' a' proc.ProcessName.StartsWith (name) 'para que continúe funcionando con VS2010. – Alconja

7

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á crear una pequeña utilidad de línea de comando 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, deberá indicarle a Visual Studio que no use Cassini. Obtuve propiedades para su aplicación web -> Web y seleccione "Usar servidor web personalizado", ingrese algo como: http://localhost:1685/ (o el número de puerto que quiera usar). A continuación, introduzca este comando en el evento posterior a la generació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 caminos son correctos, por ejemplo, ya que estoy ejecutando un sistema operativo de 64 bits, los archivos de mi programa de ruta es diferente de un sistema operativo de 32 bits. Además, mi SpawnProc.exe está en un proyecto secundario.

+0

Gracias Magnus, aunque no utilicé su solución exacta, utilicé la idea para crear una macro, que para mi propósito es un poco más simple. – Alconja

+0

@Kiquenet, ¿pueden detallar su edición? ¿Por qué crees que hay una necesidad de un FQDN para un entorno de desarrollo local con Cassini que solo funciona para localhost de todos modos? –

+0

@Lo siento, me perdiste por completo. Lo estoy cambiando a Localhost. –

22

Workaround: Debugging Global.aspx.cs Application_Start() with ASP.Net Web Server within Visual Studio

de Habilitación "Editar & Continuar" en el proyecto de servidor web trabajó para mí. No detiene el cassini cuando detiene la depuración, pero reinicia cassini cuando comienza la depuración.

+0

Buena (y simple) solución. Seguiré usando mi macro ahora ya está escrito y me da un control más detallado, pero esto todavía es bueno saberlo. Gracias. – Alconja

+0

en visual studio 2008 también cierra el servidor web al detener la depuración – Jaguar

+0

En Visual Studio 2010 también lo hace. (No borra el ícono del área de notificación hasta que coloca el cursor sobre el ícono). –

5

Inspirada en esta publicación y en otra about code clean up Agregué la macro como PostDebug-event. Por lo tanto, cada vez que el depurador regrese, eliminará todos los WebDev.WebServer-s. (Y me relajé la ProcessName-restricción.)

Nota: esto probablemente va a matar a todos los los servidores web, servidores web por lo que también de otros depuración sesiones (que está bien conmigo, en este momento, por lo general no tener alguno).Por lo tanto, es posible que solo desee buscar procesos secundarios o algo así (y publicar ese código aquí ;-)).

Así que mi código es el siguiente:

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 
+0

La mejor solución para esto, en mi opinión. – Tim

8

acabo de abrir una línea de comandos (runas admin)

ejecute el siguiente. Se debe matar a todos ellos

Taskkill /IM WebDev.WebServer40.EXE /F 
0

Otra forma es utilizar Powershell:

PD: No sé si alguien todavía está en necesidad, pero me encontré por casualidad con esta solución, mientras buscaba algo completamente diferente.

Cuestiones relacionadas