现在的位置: 首页 > 综合 > 正文

WCF实例 —— Windows Service Host 开发,调试,制作安装包

2012年11月10日 ⁄ 综合 ⁄ 共 2279字 ⁄ 字号 评论关闭

本篇实例介绍如何使用Windows Service来寄宿 WCF服务:

1. 添加 WCF Service Library 工程,这一步没什么好说的。
    为了简单测试,只保留下面一个服务方法:

[csharp] view plaincopy

  1. public class Service1 : IService1  
  2. {  
  3.     public string GetData(int value)  
  4.     {  
  5.         return string.Format("You entered: {0}", value);  
  6.     }  
  7. }  


2. 添加一个 Windows Service 工程,实现 Service1

  1. public partial class Service1 : ServiceBase  
  2. {  
  3.     public Service1()  
  4.     {  
  5.         InitializeComponent();  
  6.     }  
  7.   
  8.     private ServiceHost _host;  
  9.   
  10.     protected override void OnStart(string[] args)  
  11.     {  
  12.         _host = new ServiceHost(typeof(WinSvcHostWcfLib.Service1));  
  13.         _host.Open();  
  14.     }  
  15.   
  16.     protected override void OnStop()  
  17.     {  
  18.         if (_host != null)  
  19.         {  
  20.             _host.Close();  
  21.             (_host as IDisposable).Dispose();  
  22.         }  
  23.     }  
  24. }  

注意:ServiceHost 里的 typeof 里是 Wcf 的 Service,因为都叫 "Service1" 所以注意用 namespace 区分。
    
    添加 WCF Service Library 工程的引用 以及 System.ServiceModel.dll
    在 Service1.cs (Windows Service类) 的设计窗体上,右击点选“Add Installer”, 会在工程里添加一个 ProjectInstaller 类
    

    (1)修改ProjectInstaller.cs设计器中的 serviceInstaller1 属性的 ServiceName 为 “WinSvcHostWcf”
    (2)修改ProjectInstaller.cs设计器中的 serviceProcessInstaller1 属性的 Account 为 LocalSystem (默认为User)
    (3)为了能够Debug Service,在工程编译属性里加上下面的脚本,用 installutil.exe 安装服务,$(TargetPath) 是 Project 编译宏表示输出的绝对路径
    先删除:
    %systemroot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u $(TargetPath)
    再添加
    %systemroot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe $(TargetPath)
    

    (4)编译 WinSvcHost 工程,就可以看到在 WinSvcHostWcf 服务在 Windows Service 服务列表中了。(用控制台命令 Services.msc 查看)
    

3. 调试 Windows Service,利用 Debug -> Attach to Process 就可以对托管的进程进行 Debug。
当然 OnStart 里的代码是无法调试的,因为只有正常启动后才能看到这个托管进程。
但可以用一个Thread来启动Service。加上Thread.Sleep(),延迟真实代码的调用。下面的代码用delegate.BeginInvoke来延迟调用。
还可以利用 OnStart 的输入参数 args 来控制是否要延迟,使调试更灵活。

4. 创建一个 Console 工程来测试 WCF 服务正常运行:

[csharp] view plaincopy

  1. static void Main(string[] args)  
  2. {  
  3.     var channel = new ChannelFactory<WinSvcHostWcfLib.IService1>(new WSHttpBinding(),   
  4.         "http://localhost:8732/WinSvcHost/Service1/");  
  5.     var svc = channel.CreateChannel();  
  6.     var result = svc.GetData(300);  
  7.     Console.WriteLine(result);  
  8.     Console.Read();  
  9. }  

运行输出:You entered: 300

 

5. 创建安装部署程序
(1) 添加主输出

(2) 修改自定义Action,在 WinSvcHost里已经添加了ServiceInstaller,在下面步骤中调用主输出即可。


注意:先运行 installutil.exe /u 清理debug时安装的 WinSvcHostWcf 服务,再运行生成的 msi 安装程序。

抱歉!评论已关闭.