web-dev-qa-db-ja.com

ビルド時にASP.NET開発サーバーを自動的に停止/再起動する

VS2008でビルド/再ビルドを実行するたびにASP.NET開発サーバー(Cassini)を自動的に停止する方法はありますか(そして、必要なときに明らかに再開させることはできますか)?多分どこかに隠された設定がありますか?または、少なくともビルド後のイベントとしてそれを行う方法はあるでしょうか?

いくつかの背景の問題は、依存関係の注入などにSpring.NETを使用していることですが、アプリケーションの起動時にシングルトンをロードします。つまり、Springに関連するコード/構成を変更した場合、開発サーバーを停止する必要があるため、アプリケーションの開始イベントが再度トリガーされることを確認して、次のデバッグ/実行を再開します。つまり、一連のコード/構成を変更してデバッグを再開しても、実際にはstartは実行されていないため、新しいコードは使用されていません。

32
Alconja

それで、私はマグナスの答えに基づいた回避策になりましたが、次の比較的単純なマクロを使用します(なぜマクロに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
_

基本的にデバッガーが現在実行中の場合は、デバッガーを停止し、すべてのCassiniインスタンスであるはずの「WebDev.WebServer」という名前のプロセスを強制終了してから、デバッガーを再起動します(これにより、Cassiniが暗黙的に再起動されます)。 proc.Kill()proc.CloseMainWindow()も機能していないように見えるので、私はproc.WaitForExit(1000)を使用しています...

とにかく、マクロを入手したら、それをキーボードショートカットに割り当てたり、カスタムツールバーボタンを作成して実行したりできます。

9
Alconja

回避策:Visual Studio内のASP.Net WebサーバーでGlobal.aspx.cs Application_Start()をデバッグする

Webサーバープロジェクトで「編集して続行」を有効にするとうまくいきました。デバッグを停止してもcassiniをシャットダウンしませんが、デバッグを開始するとcassiniを再起動します。

23
mat3

コマンドラインを開くだけです(runas admin)

以下を実行します。彼ら全員を殺すべきだ

Taskkill /IM WebDev.WebServer40.EXE /F
9
wlopez

私が知っている唯一の方法は、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アプリケーションのプロパティに移動し、[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ビットOSを実行しているため、プログラムファイルのパスは32ビットOSとは異なります。また、私のSpawnProc.exeはサブプロジェクトにあります。

7

この投稿と別の投稿に触発 コードのクリーンアップについて マクロをPostDebug-eventとして追加しました。したがって、デバッガーが戻るたびに、すべてのWebDev.WebServer-sが削除されます。 (そして、ProcessName-constraintを緩和しました。)

注:これはおそらくWebServerをall殺すので、他のデバッグセッションの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
5
Yahoo Serious

別の方法は、Powershellを使用することです。

PS:まだ誰かが必要かどうかはわかりませんが、まったく違うものを探しているときに誤ってこのソリューションに遭遇しました。

0
Yahoo Serious