使用WCF selfhosting在调试模式下运行控制台应用程序?

5

我有一个托管在控制台应用程序中的WCF服务(也充当Windows服务安装程序),请查看更多信息:http://msdn.microsoft.com/en-us/library/ms733069.aspx

这是控制台应用程序中的类的样子:

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());
        }
1个回答

6

这是我的工作内容

解决方案A

  • Debug\bin文件夹中使用InstallUtil安装Windows服务
  • 使用sc startsc stop停止和启动服务
  • 一旦服务启动,执行Debug > Attach to Process...并将VS附加到服务

解决方案B

OnStart方法的第一行添加Debugger.Break调用。

解决方案C

添加一个临时的独立控制台应用程序,执行与您的服务相同的任务。


当服务在II7中运行时,我可以只指定在调试时应启动网站主机,并且它应从本地主机运行。这是一个很好的解决方案。但是现在,假设我已经将我的WCF服务安装为Windows服务,然后启动我的控制台应用程序进行调试,该控制台应用程序将尝试在已被Windows服务使用的相同通道上启动WCF服务?这意味着在调试我的控制台应用程序(selfhost)之前,我必须停止Windows服务吗?如果我只能在Visual Studio中单击“调试”并且无需其他操作,那将是很棒的。 - Banshee
@SnowJim,我理解你的观点并完全同意这是个烦恼。但目前为止,这是我想出来的最好方案。我不知道是否有更简单的解决方案。我会使用选项C(客户端和服务器是两个控制台应用程序,您可以配置在F5上同时启动它们)。一旦您不需要经常调试它,我会切换到选项A或B。 - oleksii
谢谢!我的解决方案是使用现有项目,但在主函数中添加了一个检查 Dubugger.IsAttached 的语句,如果是,则手动启动服务并在控制台中显示一些信息。到目前为止,这个方法运行得非常好。 - Banshee
我通常使用命令行参数来实现这个功能。如果程序以“/standalone”参数启动,则作为应用程序启动,否则作为服务启动。 - JohnC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接