Автоматически останавливать / перезапускать ASP.NET Development Server при сборке - PullRequest
32 голосов
/ 20 мая 2009

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

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

Ответы [ 6 ]

23 голосов
/ 20 января 2010

Обходной путь: отладка Global.aspx.cs Application_Start () с веб-сервером ASP.Net в Visual Studio

Включение «Редактировать и продолжить» на веб-сервере проекта работало для меня. Он не отключает Cassini, когда вы прекращаете отладку, но он перезапускает Cassini, когда вы начинаете отладку.

9 голосов
/ 26 апреля 2013

Я просто открываю командную строку (runas admin)

запустите следующее. Это должно убить их всех

Taskkill /IM WebDev.WebServer40.EXE /F
9 голосов
/ 21 мая 2009

Таким образом, я получил обходной путь, основанный на ответе Магнуса, но используя следующий относительно простой макрос (почему они заставляют вас использовать 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), похоже, не работают ...

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

7 голосов
/ 20 мая 2009

Единственный известный мне способ - запустить собственный запуск 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-битной ОС. Кроме того, мой SpawnProc.exe находится в подпроекте.

5 голосов
/ 21 января 2011

Вдохновленный этим и другим постом о чистке кода Я добавил макрос как PostDebug-событие. Поэтому каждый раз, когда возвращается отладчик, он удаляет все WebDev.WebServer-ы. (И я ослабил ограничение ProcessName.)

Примечание: это, вероятно, убьет все веб-серверы, а также веб-серверы других сеансов отладки (что меня устраивает, на данный момент у меня обычно их нет) Поэтому вы можете искать только дочерние процессы или что-то в этом роде (и размещать этот код здесь ;-)).

Итак, мой код выглядит так:

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
0 голосов
/ 28 марта 2014

Другой способ - использовать Powershell:

PS: я не знаю, нужен ли кто-то еще, но я случайно наткнулся на это решение, ища что-то совершенно другое.

...