在Build上自动停止/重新启动ASP.NET Development Server

时间:2009-05-20 07:58:27

标签: asp.net visual-studio cassini

有没有办法在VS2008中进行构建/重建时自动停止ASP.NET Development Server(Cassini)(然后显然需要在需要时重新启动)?也许在某处有一些隐藏的配置设置?或者至少可以通过某种方式将其作为构建后事件来进行?

对于某些背景,问题是我使用Spring.NET进行依赖注入等,但它在Application Start上加载它的单例,这意味着如果我更改任何与Spring相关的代码/配置,我必须停止开发服务器,以便下次调试/运行时再次启动,确保再次触发Application Start事件。换句话说,即使你改变了一堆代码/配置&然后再次开始调试,它实际上并没有启动,因为它已经在运行,所以你的新代码没有被使用。

6 个答案:

答案 0 :(得分:23)

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

在Web服务器项目上启用“编辑并继续”对我有用。当你停止调试时它不会关闭cassini,但是当你开始调试时它会重启cassini。

答案 1 :(得分:9)

所以我最终得到了一个基于Magnus回答的解决方法,但使用下面相对简单的宏(为什么它们会强制你使用VB进行宏?我感觉很脏):

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

基本上,如果调试器当前正在运行,它将停止它并且然后杀死任何名为“WebDev.WebServer”的进程,该进程应该是所有Cassini实例,然后再次启动调试器(这将再次隐式启动Cassini)。我正在使用proc.Kill(),因为proc.CloseMainWindow()proc.WaitForExit(1000)似乎都不起作用......

无论如何,一旦你有了宏,就可以将它分配给键盘快捷键,或创建自定义工具栏按钮来运行它。

答案 2 :(得分:9)

我只是打开一个命令行(runas admin)

运行以下内容。它应该杀死所有人

Taskkill /IM WebDev.WebServer40.EXE /F

答案 3 :(得分:7)

我知道的唯一方法是在post.build事件上执行自定义Cassini启动。此自定义过程会杀死所有Cassini实例,并启动一个新实例。 为了使其工作,您需要构建一个小型自定义命令行实用程序。我在这里称它为SpawnProcess。

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());
          }
        }
      }
    }
  }
}

然后,您将指示Visual Studio不使用Cassini。获得了Web应用程序的属性 - &gt;在Web上选择“使用自定义Web服务器”,输入如下内容:http://localhost:1685/(或者您要使用的任何端口号)。 然后,在构建后事件中输入此命令:

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

确保您的路径正确,例如,因为我运行的是64位操作系统,所以我的程序文件路径与32位操作系统不同。另外,我的SpawnProc.exe位于子项目中。

答案 4 :(得分:5)

受此帖和另一篇about code clean up的启发 我将宏添加为PostDebug-event。因此,每次调试器返回时,它都将删除所有WebDev.WebServer-s。 (我放宽了ProcessName约束。)

注意:这可能会杀死所有 Web服务器,所以其他调试会话的Web服务器也是如此(这对我很好,此时我通常没有)。所以你可能只想查找子进程或类似的东西(并在这里发布代码;-))。

所以我的代码看起来像这样:

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 :(得分:0)

另一种方法是使用Powershell:

PS:我不知道是否有人仍然需要,但我只是偶然遇到了这个解决方案,同时寻找完全不同的东西。