32

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

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

4

6 回答 6

23

解决方法:在 Visual Studio 中使用 ASP.Net Web 服务器调试 Global.aspx.cs Application_Start()

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

于 2010-01-19T22:52:31.910 回答
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)似乎不起作用......

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

于 2009-05-21T04:05:26.027 回答
9

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

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

Taskkill /IM WebDev.WebServer40.EXE /F
于 2013-04-26T06:28:11.940 回答
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 应用程序的属性 -> 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 在一个子项目中。

于 2009-05-20T13:19:05.557 回答
5

受这篇文章和另一篇关于代码清理的启发, 我将宏添加为 PostDebug-event。所以每次调试器返回时,都会删除所有的WebDev.WebServer-s。(我放松了 ProcessName 约束。)

注意:这可能会杀死所有的 WebServer,其他调试会话的 WebServer 也是如此(这对我来说很好,目前我通常没有)。因此,您可能只想寻找子进程或类似的东西(并在此处发布该代码;-))。

所以我的代码如下所示:

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
于 2011-01-21T16:09:56.743 回答
0

另一种方法是使用 Powershell:

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

于 2014-03-28T17:00:50.727 回答