Soru Build üzerinde ASP.NET Geliştirme Sunucusunu otomatik olarak durdur / yeniden başlat


VS2008'de bir build / rebuild yaptığım her defasında ASP.NET Geliştirme Sunucusunu (Cassini) otomatik olarak durdurmanın bir yolu var mı (ve sonra gerektiğinde yeniden başlatılsın mı)? Belki bir yerlerde gizli konfigürasyon ayarı var mı? Ya da en azından post-inşa olayı olarak yapmanın bir yolu olabilir mi?

Bazı arka plan için, konu bağımlılık enjeksiyonu için Spring.NET kullanıyorum, ama ben tek bir uygulamayı Application Start üzerinde yükler, yani eğer herhangi bir yay ile ilgili kod / konfigürasyonu değiştirirsem, Geliştirme Sunucusunu durdurmam gerekir. Uygulama Başlat olayının tekrar tetiklenmesini sağlayarak bir sonraki hata ayıklama / çalıştırma işlemini başlatır. Diğer bir deyişle, bir grup kod / config değiştirseniz ve tekrar hata ayıklamaya başlasanız bile, aslında başla Yine, zaten çalışıyor olduğundan, yeni kodunuz kullanılmıyor.


32
2018-05-20 07:58


Menşei


Sağladığın arka plan olmadan neden buna ihtiyacın olduğunu merak ediyorum. :) Yine de yardımcı olamaz. - Arnis Lapsa
Aynı arzum var ama çok farklı bir problem. Web uygulamamın yerel bağımlılıkları (veritabanı sürücüleri) var ve derlememiz bunları çıkış dizinine kopyalar. (Sürücülerin etrafındaki .NET paketleyicileri, yerel DLL'lere statik bağlamalar içerir; bin dizin. Güven Bana. Oracle istemcisini yüklemeye çalışmaktan çok daha iyi bir çözümdür.) Ne yazık ki, geliştirme sunucusu yerel DLL'lerde kilitler barındırıyor, bu nedenle bunları kopyalama sırasında kopyalama başarısız oluyor. Yeniden yapılandırmam gereken her zaman web sunucusunu el ile durdurmak zorunda kaldığım çok sinir bozucu. - jpmc26


Cevaplar:


Geçici çözüm: Visual Studio içinde ASP.NET Web sunucusu ile Global.aspx.cs Application_Start () hata ayıklama

Web sunucusu projesinde "Düzenle ve Devam Et" özelliğini etkinleştirmek benim için çalıştı. Hata ayıklamayı durdurduğunuzda cassini kapanmaz, ancak hata ayıklamaya başladığınızda cassini yeniden başlatılır.


23
2018-01-19 22:52



Güzel (ve basit) bir çözüm. Makroyu kullanmaya devam edeceğim, şimdiden yazılmış ve bana daha iyi bir kontrole sahip. Ama yine de bunu bilmek güzel. Teşekkürler. - Alconja
Visual Studio 2008'de ayrıca web sunucusunu hata ayıklamayı durdurmada da kapatır - Jaguar
Visual Studio 2010'da da öyle. (Bu simge simgesinin üzerine gelene kadar bildirim alanı simgesini temizlemez.) - Ryan Lundy
Ve bu yöntem de IIS Express'te çalışır! - Ryan Lundy
Her nasılsa benim VS2010 tam olarak nasıl Kyralessa açıkladı ama ben bu "Düzenle & Devam" ayarı ile oynadı ve ben bunu değiştirmek ne zaman hiçbir şey yapmak gibi görünüyor: (Ben durdurmak her zaman sıfırlamak istemiyorum :() - felickz


Bu yüzden, Magnus'ın cevabına dayanan bir geçici çözümle karşılaştım, ama şu nispeten basit bir makroyu kullanarak (neden makrolar için VB'yi kullanmaya zorluyorsunuz? Kirli hissediyorum):

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

Temelde, hata ayıklayıcı şu anda çalışıyorsa, bunu durduracak ve ardından tüm Cassini örnekleri olması gereken "WebDev.WebServer" adlı bir işlemi sonlandırır ve ardından hata ayıklayıcısını yeniden başlatır (bu, dolaylı olarak Cassini'yi yeniden başlatır). kullanıyorum proc.Kill() çünkü ikisi de proc.CloseMainWindow() veya proc.WaitForExit(1000) çalışmak gibiydi ...

Yine de, makronuzu aldıktan sonra onu klavye kısayollarına atayabilir veya çalıştırmak için özel araç çubuğu düğmeleri oluşturabilirsiniz.


9
2018-05-21 04:05



Not: değiştirmek için anonim bir düzenleyici tarafından değiştirildi proc.ProcessName = name için proc.ProcessName.StartsWith(name) Böylece VS2010 ile çalışmaya devam ediyor. - Alconja


Sadece bir komut satırı açtım (runas admin)

aşağıdakileri çalıştırın. Hepsini öldürmeli

Taskkill /IM WebDev.WebServer40.EXE /F

9
2018-04-26 06:28





Bildiğim tek yol, post.build olayında özel bir Cassini başlangıcı yapmak. Bu özel işlem, Cassini'nin tüm örneklerini öldürür ve yeni bir tane başlatır. Bunu işe almak için, küçük bir özel komut satırı yardımcı programı oluşturmanız gerekir. SpawnProcess'i buraya çağırdım.

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());
          }
        }
      }
    }
  }
}

Sonra Visual Studio'ya Cassini'yi kullanmama talimatını vereceksin. Web uygulamanız için özellikler aldınız -> Web ve "Özel Web Sunucusunu Kullan" seçeneğini seçiniz, gibi bir şey giriniz:http://localhost:1685/ (Ya da kullanmak istediğiniz port numarası). Ardından, bu komutu post-build olaya girin:

"$(ProjectDir)..\SpawnProc\bin\debug\SpawnProc" "C:\Program Files (x86)\Common Files\microsoft shared\DevServer\9.0\WebDev.WebServer.exe" 1685 "$(ProjectDir)" /

Örneğin, 64 bit işletim sistemi çalıştırdığımdan, program dosya yolumun 32 bit işletim sisteminden farklı olduğundan yollarınızın doğru olduğundan emin olun. Ayrıca, SpawnProc.exe bir alt projede.


7
2018-05-20 13:19



Teşekkürler Magnus, tam çözümünüzü kullanmadığım halde, maksatlarım biraz daha basit olan bir makro oluşturma fikrini kullandım. - Alconja
@Kiquenet, lütfen düzenlemenizi detaylandırır mısınız? Neden sadece localhost için çalışan Cassini ile yerel bir dev ortam için bir FQDN'ye ihtiyaç olduğunu düşünüyorsunuz? - Magnus Johansson
@Sorry, beni tamamen kaybettin. Onu Localhost'a değiştiriyorum. - Magnus Johansson


Bu yazıdan ve başka birinden esinlenildi kod temizliği hakkında Makroyu PostDebug olayı olarak ekledim. Böylece hata ayıklayıcısını her döndürdüğünde, tüm WebDev.WebServer-s kaldırır. (Ve ProcessName-kısıtlamasını gevşettim.)

Not: Bu muhtemelen öldürecek herşeyWebServer'lar, yani diğer hata ayıklama oturumlarının WebServer'ları (şu anda benim için iyi olan, şu anda genelde hiç yok). Bu yüzden sadece çocuk süreçlerini veya bunun gibi bir şeyi (ve burada kod yazabiliriz ;-)) aramak isteyebilirsiniz.

Yani kodum şunun gibi görünüyor:

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
2018-01-21 16:09



Bunun için en iyi çözüm, bence. - Tim


Başka bir yol Powershell kullanıyor:

Not: Kimsenin hala ihtiyacı olup olmadığını bilmiyorum, ama tamamen farklı bir şey ararken yanlışlıkla kazara bu çözüme koştum.


0
2018-03-28 17:00