Подтвердить что ты не робот

Автоматическая остановка/перезапуск сервера разработки ASP.NET на сборке

Есть ли способ автоматически остановить сервер разработки ASP.NET(Cassini) всякий раз, когда я делаю сборку/перестройку в VS2008 (а затем, очевидно, снова запускается, когда это необходимо)? Может быть, где-то есть скрытая настройка конфигурации? Или, по крайней мере, какой-то способ сделать это как событие после сборки?

Для некоторого фона проблема заключается в том, что я использую Spring.NET для инъекций зависимостей и т.д., но он загружает свои синглтоны в Application Start, что означает, что если я изменю какой-либо связанный код/​​конфигурацию spring, у меня есть для остановки сервера разработки, чтобы он снова запускал следующий отладчик/запуск, гарантируя, что событие запуска приложения снова будет запущено. Другими словами, даже если вы меняете кучу кода/конфига, а затем снова начинаете отладку, он фактически не запускается снова, поскольку он уже запущен, поэтому ваш новый код не используется.

4b9b3361

Ответ 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) не работают...

В любом случае, как только вы получите свой макрос, вы можете назначить его сочетания клавиш или создать собственные кнопки на панели инструментов для его запуска.

Ответ 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: Я не знаю, нуждается ли кто-нибудь в этом, но я просто случайно столкнулся с этим решением, ища что-то совершенно другое.