2012-07-13 20 views
5

私は(また、Windowsサービスのインストーラとして機能)コンソルアプリケーションでホストされたWCFサービスを持って、嘆願は、ここで詳細を参照してください。http://msdn.microsoft.com/en-us/library/ms733069.aspxWCFセルフホストでデバッグモードでコンソールアプリケーションを実行していますか?

これは、コンソル・アプリケーションのクラスがどのように見えるかです:

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

    } 

これはWindowsサービスで実行するために作られていますが、どうすればデバッグモード(開発中)で通常のセルフホストとして実行できますか?実行時にこのサービスをデバッグできる特別なプロジェクトを開始する必要がありますか?

編集:私は、既存のWindowsサービスプロジェクトを使用しますが、このような何かにメインを変更することを決めた

は:

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

答えて

6

これは私が何をすべきかです

ソリューション

  • デバッグ\ binにフォルダ
  • 停止からInstallUtilを使用してWindowsサービスをインストールし、サービスがデバッグ>プロセスにアタッチを行う始めたらsc startまたはsc stop
  • を使用してサービスを開始...とサービス
  • にVSを添付

溶液B

は、最初の行にDebugger.Breakコールを持っていますOnStartメソッド。

ソリューションC

は、サービスと同じ仕事をして、一時、別のコンソールアプリケーションを追加します。

+0

サービスがII7で実行されていたときに、ウェブサイトホストがデバッグ中に起動され、ローカルホストから実行されていなければならないと述べました。これは素晴らしい解決策でした。しかし、今、WCFサービスを既にWindowsサービスとしてインストールしておいて、デバッグのために私のコンソールアプリケーションを起動すると、このコンソールアプリケーションはWindowsサービスですでに使用されているのと同じチャネルでWCFサービスを開始しようとします。つまり、私のconsol App(selfhost)をデバッグする前にWindowsサービスを停止しなければならないということですか?私がビジュアルスタジオでデバッグを打つことができれば素晴らしいだろう。 – Banshee

+0

@SnowJim私はあなたがポイントを参照してくださいと私は完全にそれが痛みであることに同意します。しかし、これまでのところ私が思いついたのです。私はもっ​​と単純な解決法を知らない。私はオプションC(クライアントとサーバーは2つのコンソールアプリケーションであり、両方をF5で起動するように設定できます)で作業します。一度デバッグする必要がなければ、オプションAまたはBに切り替えます。 – oleksii

+0

ありがとう!私の解決策は、既存のプロジェクトをServiceBase.Runの代わりに使用することです(new(MyAppWindowsService())。メインではDubugger.IsAttachedのチェックを追加しました。もしそうなら手動でサービスを開始し、コンソールに情報を表示してください。 – Banshee

関連する問題