代码之家  ›  专栏  ›  技术社区  ›  Alconja

生成时自动停止/重新启动ASP.NET开发服务器

  •  32
  • Alconja  · 技术社区  · 15 年前

    当我在VS2008中进行构建/重建时,是否有一种方法可以自动停止ASP.NET开发服务器(Cassini)(然后在需要时再次启动)?也许某个地方有隐藏的配置设置?或者至少可以用某种方式把它作为一个后期构建事件来做?

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

    6 回复  |  直到 8 年前
        1
  •  23
  •   Albireo    8 年前

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

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

        2
  •  9
  •   Community noseratio    12 年前

    因此,我最终得到了一个基于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) 似乎有用…

    总之,一旦你有了宏,你就可以将它指定给键盘快捷键,或者创建自定义工具栏按钮来运行它。

        3
  •  9
  •   Jesse    11 年前

    我刚打开一个命令行(runas-admin)

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

    Taskkill /IM WebDev.WebServer40.EXE /F
    
        4
  •  7
  •   Magnus Johansson    10 年前

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

    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位操作系统。另外,我的spawproc.exe在一个子项目中。

        5
  •  5
  •   Community noseratio    7 年前

    灵感来源于这篇文章和另一篇文章 about code clean up 我将宏添加为调试后事件。因此,每当调试器返回时,它将删除所有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
    
        6
  •  0
  •   Yahoo Serious    10 年前

    另一种方法是使用PowerShell:

    附言:我不知道是否还有人需要,但我只是在寻找完全不同的东西时意外地遇到了这个解决方案。