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