Автоматическая остановка/перезапуск сервера разработки ASP.NET на сборке
Есть ли способ автоматически остановить сервер разработки ASP.NET(Cassini) всякий раз, когда я делаю сборку/перестройку в VS2008 (а затем, очевидно, снова запускается, когда это необходимо)? Может быть, где-то есть скрытая настройка конфигурации? Или, по крайней мере, какой-то способ сделать это как событие после сборки?
Для некоторого фона проблема заключается в том, что я использую Spring.NET для инъекций зависимостей и т.д., но он загружает свои синглтоны в Application Start, что означает, что если я изменю какой-либо связанный код/конфигурацию spring, у меня есть для остановки сервера разработки, чтобы он снова запускал следующий отладчик/запуск, гарантируя, что событие запуска приложения снова будет запущено. Другими словами, даже если вы меняете кучу кода/конфига, а затем снова начинаете отладку, он фактически не запускается снова, поскольку он уже запущен, поэтому ваш новый код не используется.
Ответы
Ответ 1
Итак, у меня получилось обходное решение, основанное на ответе Магнуса, но используя следующий относительно простой макрос (почему они заставляют вас использовать 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
Обход проблемы: отладка Global.aspx.cs Application_Start() с веб-сервером ASP.Net в Visual Studio
Включение "Редактировать и продолжить" в проекте веб-сервера работало для меня. Он отключает cassini, когда вы останавливаете отладку, но перезагружает cassini при запуске отладки.
Ответ 3
Я просто открываю командную строку (runas admin)
выполните следующее. Он должен убить всех из них
Taskkill /IM WebDev.WebServer40.EXE /F
Ответ 4
Единственный способ, которым я знаю, - создать пользовательский запуск Cassini в событии post.build. Этот выполненный на заказ процесс убивает все экземпляры 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. Получите свойства для своего веб-приложения → Веб и выберите "Использовать пользовательский веб-сервер", введите что-то вроде: 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-битной ОС. Кроме того, my SpawnProc.exe находится в подпроекте.
Ответ 5
Вдохновленный этим сообщением, а другой о очистке кода
Я добавил макрос как событие PostDebug. Поэтому каждый раз, когда возвращается отладчик, он удаляет все WebDev.WebServer-s. (И я смягчил ограничение ProcessName.)
Примечание. Вероятно, это приведет к удалению всех WebServers, а также WebServers других отладочных сессий (что в моих силах, на данный момент у меня обычно нет). Таким образом, вы можете искать только дочерние процессы или что-то в этом роде (и размещайте этот код здесь;-)).
Итак, мой код выглядит так:
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
Другой способ использования Powershell:
PS: Я не знаю, нуждается ли кто-нибудь в этом, но я просто случайно столкнулся с этим решением, ища что-то совершенно другое.