2012-07-13 11 views
5

Tengo un servicio de WCF alojado en una aplicación de consola (que también actúa como el instalador de Windows Service), súplicas ver más aquí: http://msdn.microsoft.com/en-us/library/ms733069.aspxEjecutando la aplicación de consol en modo de depuración con WCF selfhosting?

Ésta es la forma en la clase en la aplicación de consola se ve así:

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

    } 

Esto está hecho para ejecutarse en un servicio de Windows, ¿cómo puedo hacer para que pueda ejecutar esto como un autohost normal en modo de depuración (durante el desarrollo)? ¿o realmente tengo que comenzar un proyecto especial para poder depurar este servuce durante el tiempo de ejecución?

Editar:

decidí utilizar el proyecto de servicio de Windows existente, sino cambiar el principal a algo como esto:

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

Respuesta

6

Esto es lo que hago

Solución A

  • Instalar un servicio de Windows usando InstallUtil de mi depuración \ bin carpeta
  • parada y empezar a utilizar el servicio sc start o sc stop
  • Una vez que el servicio comenzó a hacer Test> Asociar al proceso ... y adjuntar VS al servicio

Solución B

tiene una llamada Debugger.Break en la primera línea de el método OnStart.

Solución C

Agregar una aplicación de consola separada temperatura que hace el mismo trabajo que su servicio.

+0

Cuando el servicio se estaba ejecutando en II7 podía simplemente decir que el host del sitio web debería iniciarse cuando estaba en depuración y que debía ejecutarse desde el host local. Esta fue una gran solución. Pero ahora, decir que ya tengo mi servicio WCF instalado como un servicio de Windows y luego inicia mi aplicación de consolidación para la depuración, esta aplicación de consola intentará iniciar un servicio WCF en el mismo canal que ya está siendo utilizado por el servicio de Windows. Esto significa que tengo que detener el servicio de Windows antes de depurar mi aplicación consol (selfhost)? Sería grandioso si pudiera acceder a la depuración en Visual Studio y nada más. – Banshee

+0

@SnowJim Veo que lo señalas y estoy totalmente de acuerdo en que es un dolor. Pero hasta ahora esto es lo que se me ocurrió. No estoy al tanto de ninguna solución más simple. Trabajaría con la opción C (el cliente y el servidor son dos aplicaciones de consola y puede configurarlas para iniciarlas en F5). Una vez que no necesite depurarlo, cambiaría por la opción A o B. – oleksii

+0

¡Gracias! Mi solución es usar el proyecto existente, pero en lugar de ServiceBase.Run (nuevo (MyAppWindowsService() en general, agregué un cheque para Dubugger.IsAttached y si es así, inicio manualmente los servicios y también muestro algo de información en la consola. Esto funciona muy bien hasta ahora. – Banshee

Cuestiones relacionadas