WCF实例 —— Windows Service Host 开发,调试,制作安装包
2013-04-15 08:49
495 查看
本篇实例介绍如何使用Windows Service来寄宿 WCF服务:
1. 添加 WCF Service Library 工程,这一步没什么好说的。
为了简单测试,只保留下面一个服务方法:
[csharp] view plaincopy
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
}
2. 添加一个 Windows Service 工程,实现 Service1
[html] view plaincopy
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
private ServiceHost _host;
protected override void OnStart(string[] args)
{
_host = new ServiceHost(typeof(WinSvcHostWcfLib.Service1));
_host.Open();
}
protected override void OnStop()
{
if (_host != null)
{
_host.Close();
(_host as IDisposable).Dispose();
}
}
}
注意: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
static void Main(string[] args)
{
var channel = new ChannelFactory<WinSvcHostWcfLib.IService1>(new WSHttpBinding(),
"http://localhost:8732/WinSvcHost/Service1/");
var svc = channel.CreateChannel();
var result = svc.GetData(300);
Console.WriteLine(result);
Console.Read();
}
运行输出:You entered: 300
5. 创建安装部署程序
(1) 添加主输出
(2) 修改自定义Action,在 WinSvcHost里已经添加了ServiceInstaller,在下面步骤中调用主输出即可。
注意:先运行 installutil.exe /u 清理debug时安装的 WinSvcHostWcf 服务,再运行生成的 msi 安装程序。
1. 添加 WCF Service Library 工程,这一步没什么好说的。
为了简单测试,只保留下面一个服务方法:
[csharp] view plaincopy
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
}
2. 添加一个 Windows Service 工程,实现 Service1
[html] view plaincopy
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
private ServiceHost _host;
protected override void OnStart(string[] args)
{
_host = new ServiceHost(typeof(WinSvcHostWcfLib.Service1));
_host.Open();
}
protected override void OnStop()
{
if (_host != null)
{
_host.Close();
(_host as IDisposable).Dispose();
}
}
}
注意: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
static void Main(string[] args)
{
var channel = new ChannelFactory<WinSvcHostWcfLib.IService1>(new WSHttpBinding(),
"http://localhost:8732/WinSvcHost/Service1/");
var svc = channel.CreateChannel();
var result = svc.GetData(300);
Console.WriteLine(result);
Console.Read();
}
运行输出:You entered: 300
5. 创建安装部署程序
(1) 添加主输出
(2) 修改自定义Action,在 WinSvcHost里已经添加了ServiceInstaller,在下面步骤中调用主输出即可。
注意:先运行 installutil.exe /u 清理debug时安装的 WinSvcHostWcf 服务,再运行生成的 msi 安装程序。
相关文章推荐
- WCF实例 —— Windows Service Host 开发,调试,制作安装包
- Windows Service开发日志二(安装与调试)
- 宿主在Windows Service中的WCF(创建,安装,调用) (host到exe,非IIS)
- .net Windows服务程序和安装程序制作图解 及 VS 2010创建、安装、调试 windows服务(windows service)
- Visual Studio.net 2010 Windows Service 开发,安装与调试
- Windows Service 开发,安装与调试
- 宿主在Windows Service中的WCF(创建,安装,调用) (host到exe,非IIS)
- windows service 开发、安装及调试
- WCF调试异常信息:ServiceHost 仅支持类服务类型
- WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Windows应用程序宿主】
- 在本机windows下,通过eclispe连接到linux虚拟机上安装好的haoop,进行开发调试
- Windows Service 使用参数安装DEMO,可使用控制台启动方式进行调试,服务安装完后立即启动
- WCF ServiceHost的实例方式及ServiceHost实例的并发方式
- WCF调试异常信息:ServiceHost 仅支持类服务类型
- 创建、安装、调试windows service(附详细步骤)
- VS2010关于WindowsService 制作安装程序包,无法自动install的问题解决方法
- C# VS 2010创建、安装、调试 windows服务(windows service)
- 软件开发流程实例之五 :制作安装盘
- C#制作Windows service服务系列一:制作一个可安装、可启动、可停止、可卸载的Windows service
- C#制作Windows service服务系列一:制作一个可安装、可启动、可停止、可卸载的Windows service