在本教程中,将学习如何在Windows服务中托管WCF服务。Windows服务托管适用于长时间运行的WCF服务,其中服务的生命周期由操作系统控制。在之前的WCF教程中,已经实现了在控制台应用程序中的WCF自托管,现在将按照逐步的方法来托管WCF服务。
在Visual Studio中,创建一个新的类库项目,命名为“StudentService”,然后添加一个新的“WCF服务”到这个类库项目中。这将添加服务契约(IStudentService)及其实现类(StudentService)到类库项目中,并添加对System.ServiceModel的引用。
IStudentService接口的代码如下:
        public interface IStudentService
        {
            string GetStudentInfo(int studentId);
        }
    
StudentService实现类的代码如下:
        public class StudentService : IStudentService
        {
            public string GetStudentInfo(int studentId)
            {
                string studentName = string.Empty;
                switch (studentId)
                {
                    case 1:
                        studentName = "Muhammad Ahmad";
                        break;
                    case 2:
                        studentName = "Muhammad Hamza";
                        break;
                    default:
                        studentName = "No student found";
                        break;
                }
                return studentName;
            }
        }
    
为了在Windows服务中托管这个WCF服务,让向解决方案中添加一个新的Windows服务项目“WinServiceStudentHost”。Windows服务将引用StudentService类库和System.ServiceModel。
在Windows服务的OnStart()方法中编写WCF服务托管代码,并在OnStop()方法中相应地关闭服务。
        public partial class StudentHost : ServiceBase
        {
            ServiceHost studentServiceHost = null;
            public StudentHost()
            {
                InitializeComponent();
            }
            protected override void OnStart(string[] args)
            {
                try
                {
                    Uri httpBaseAddress = new Uri("http://localhost:4321/StudentService");
                    studentServiceHost = new ServiceHost(typeof(StudentService.StudentService), httpBaseAddress);
                    studentServiceHost.AddServiceEndpoint(typeof(StudentService.IStudentService), new WSHttpBinding(), "");
                    ServiceMetadataBehavior serviceBehavior = new ServiceMetadataBehavior();
                    serviceBehavior.HttpGetEnabled = true;
                    studentServiceHost.Description.Behaviors.Add(serviceBehavior);
                    studentServiceHost.Open();
                }
                catch (Exception ex)
                {
                    studentServiceHost = null;
                }
            }
            protected override void OnStop()
            {
                if (studentServiceHost != null)
                {
                    studentServiceHost.Close();
                    studentServiceHost = null;
                }
            }
        }
    
不要忘记使用System.ServiceModel和System.ServiceModel.Description命名空间。
为了安装Windows服务,需要向项目中添加一个安装程序类。右键点击Windows服务项目WinServiceStudentHost,选择添加->新建项->安装程序类。
Host Installer类的代码如下:
        [RunInstaller(true)]
        public partial class StudentHostInstaller : System.Configuration.Install.Installer
        {
            public StudentHostInstaller()
            {
                ServiceProcessInstaller process = new ServiceProcessInstaller();
                process.Account = ServiceAccount.NetworkService;
                ServiceInstaller service = new ServiceInstaller();
                service.ServiceName = "StudentHostWindowService";
                service.DisplayName = "StudentHostWindowService";
                service.Description = "Student WCF Service Hosted Successfully.";
                service.StartType = ServiceStartMode.Automatic;
                Installers.Add(process);
                Installers.Add(service);
            }
        }
    
不要忘记使用System.ServiceProcess命名空间。