有没有办法在VS2008中进行构建/重建时自动停止ASP.NET Development Server(Cassini)(然后显然需要在需要时重新启动)?也许在某处有一些隐藏的配置设置?或者至少可以通过某种方式将其作为构建后事件来进行?
对于某些背景,问题是我使用Spring.NET进行依赖注入等,但它在Application Start上加载它的单例,这意味着如果我更改任何与Spring相关的代码/配置,我必须停止开发服务器,以便下次调试/运行时再次启动,确保再次触发Application Start事件。换句话说,即使你改变了一堆代码/配置&然后再次开始调试,它实际上并没有启动,因为它已经在运行,所以你的新代码没有被使用。
答案 0 :(得分:23)
在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:
powershell Stop-Process -name webdev.webserver
powershell.exe Stop-Process -Name @('WebDev.WebServer*', 'Microsoft.Expression.Web*')