2012-07-13 5 views
5

Ich habe einen WCF-Dienst in einer Konsole-Anwendung gehostet (die auch als Windows-Dienst-Installer wirkt), siehe Bitten hier mehr: http://msdn.microsoft.com/en-us/library/ms733069.aspxAusführen von Consol-Anwendung im Debug-Modus mit WCF Selfhosting?

Dies ist, wie die Klasse in der Consol-Anwendung wie folgt aussieht:

public class MyAppWindowsService : ServiceBase 
    { 
     public ServiceHost _MyAppClientServiceHost = null; 
     public ServiceHost _MyAppIntegrationServiceHost = null; 
     public ServiceHost _MyAppserviceHost = null; 

     public MyAppWindowsService() 
     { 
      // Name the Windows Service 
      ServiceName = "MyApp Service"; 
     } 

     public static void Main() 
     { 
      ServiceBase.Run(new MyAppWindowsService()); 
     } 

     private void StopService(ServiceHost serviceHost) 
     { 
      if (serviceHost != null) 
      { 
        serviceHost.Close(); 
        serviceHost = null; 
      } 
     } 
     private ServiceHost StartService(Type serviceType) 
     { 
      ServiceHost serviceHost = null; 

      // Create a ServiceHost for the CalculatorService type and 
      // provide the base address. 
      serviceHost = new ServiceHost(serviceType); 

      // Open the ServiceHostBase to create listeners and start 
      // listening for messages. 
      serviceHost.Open(); 

      return serviceHost; 
     } 
     private void StartServices() 
     { 
      StopService(_MyAppClientServiceHost); 
      StopService(_MyAppIntegrationServiceHost); 
      StopService(_MyAppServiceHost); 

      _MyAppClientServiceHost = StartService(typeof(MyApp.ServiceImplementation.MyAppClientService)); 
      _MyAppIntegrationServiceHost = StartService(typeof(MyApp.ServiceImplementation.MyAppIntegration)); 
      _MyAppServiceHost = StartService(typeof(MyApp.ServiceImplementation.HL7Service)); 
     } 
     private void StopServices() 
     { 
      StopService(_MyAppClientServiceHost); 
      StopService(_MyAppIntegrationServiceHost); 
      StopService(_MyAppHl7ServiceHost); 
     } 

     // Start the Windows service. 
     protected override void OnStart(string[] args) 
     { 
      StartServices(); 
     } 

     protected override void OnStop() 
     { 
      StopServices(); 
     } 

    } 

Dies ist für die Ausführung in einem Windows-Dienst gemacht, wie mache ich so kann ich dies als eine regelmäßige Selfhost im Debug-Modus (während der Entwicklung) ausführen? Oder muss ich wirklich ein spezielles Projekt starten, um diese Servuce während der Laufzeit debuggen zu können?

Edit:

Ich beschloss, die bestehende Windows-Projekt zu verwenden, aber das Haupt zu so etwas wie dies zu ändern:

public static void Main() 
     { 
      if (Debugger.IsAttached) 
      { 
       Console.WriteLine("--- MyApp Services ---"); 
       Console.WriteLine("Starting services..."); 
       Instance.StartServices(); 
       Console.WriteLine("--Finished--"); 
       Console.WriteLine("Press any key to exit"); 
       Console.ReadKey(); 
       Instance.StopServices(); 
      } 
      else 
       ServiceBase.Run(new MyAppWindowsService()); 
     } 

Antwort

6

Das ist, was ich tue

Lösung A

  • Installieren Sie einen Windows-Dienst mit InstallUtil von meinem Debug \ bin Ordner
  • Stopp und Start-Dienst sc start oder sc stop
  • Sobald Dienst Debug tun gestartet> Attach to Process ... und befestigen VS an den Dienst

Lösung B

Haben Sie einen Debugger.Break Anruf auf der ersten Zeile die OnStart Methode.

Lösung C

eine temporäre separate Konsolenanwendung hinzufügen, die die gleiche Arbeit wie Ihr Dienst tut.

+0

Wenn der Dienst in II7 ausgeführt wurde, konnte ich nur angeben, dass der Website-Host im Debug gestartet werden sollte und dass er von localhost ausgeführt werden sollte. Das war eine großartige Lösung. Aber jetzt, sagen wir, dass ich meinen WCF-Dienst bereits als Windows-Dienst installiert habe und dann meine Consol-Anwendung zum Debuggen starte, wird diese Consol-App versuchen, einen WCF-Dienst auf demselben Kanal zu starten, der bereits vom Windows-Dienst verwendet wird? Das bedeutet, dass ich den Windows-Dienst vor dem Debuggen meiner Consol-App (Selfhost) beenden muss? Es wäre toll, wenn ich nur im Visual Studio auf Debugging stoße und sonst nichts. – Banshee

+0

@SnowJim Ich sehe Sie zeigen und ich stimme völlig zu, es ist ein Schmerz. Aber so weit bin ich gekommen. Mir ist keine einfachere Lösung bekannt. Ich würde mit der Option C arbeiten (Client und Server sind zwei Konsolenanwendungen und Sie können konfigurieren, sie beide auf F5 zu starten). Sobald Sie es nicht viel debuggen müssen, würde ich für Option A oder B wechseln. – oleksii

+0

Danke! Meine Lösung ist, das vorhandene Projekt zu verwenden, aber anstelle von ServiceBase.Run (neu (MyAppWindowsService()) habe ich im Wesentlichen einen Check für Dubugger.IsAttached hinzugefügt und wenn dies manuell gestartet wird, werden auch einige Informationen in der Konsole angezeigt. Das funktioniert großartig so weit – Banshee

Verwandte Themen