由于业务中有些任务需要在后台静默长期运行,或者有些服务队响应的要求比较苛刻,这样的WCF服务就不适合寄宿于IIS中。IIS每隔一段时间w3wp进程会闲置超时,造成服务的运行停止,因此这种耗时或者定时任务更加适合以windows服务的形式作为后台进程静默运行。
- 创建WCF服务相关类库
首先创建一个类库程序
在类库程序中添加WCF服务文件
右键选择添加新建项——在搜索框中输入WCF——选择第一个WCFService并重命名为HelloService。
删除类库中的App.config配置文件,这个配置文件用不到。修改IHelloService接口中方法的名称和返回值。默认程序返回值为空不利于我们测试。修改后的代码如下:
[ServiceContract]
public interface IHelloService
{
[OperationContract]
string DoWork();
}
同时修改接口实现类HelloService中的方法,修改后的代码如下
public string GetMessage()
{
return "HelloWorld";
}
这样WCF服务就创建好了,下面接着创建WCF的宿主程序——Windows服务
- 创建Windows服务程序
右键选择解决方案——添加——新建项——选择Windows Service
创建完成后删除默认生成的服务类Service1,我们自己创建一个。右键选择HelloService——添加——新建项——选择Windows Service
创建完成后在服务设计界面上点击右键选择添加安装程序,添加服务的安装选项
添加完成后,需要设置服务的启动方式和运行账户。首先在服务安装程序的设计界面上右键选择serviceInstallser1——属性——在右面的属性对话框中将StartType设置为Automatic
在服务安装程序设计界面上右键选择serviceProcessInstaller1——属性——在右边的属性对话框中设置Account属性的值为LocalSystem,如下图所示
以上设置完成后,修改windows服务程序中Program类中Main方法中要创建的服务实类为WCFServiceHost,否则编译不过。
这样服务在安装启动以后就会以LocalSystem账户的形式在后台自动运行
- 在Windows服务中寄宿WCF服务
1、在windows服务项目中添加System.Service.Model和WCF服务类库
2、修改配置文件,添加WCF服务相关的配置信息,在<system.serviceModel> </system.serviceModel>节点添加如下配置信息
<system.serviceModel>
<services>
<service name="SimpleService.HelloService">
<!--设置服务节点,服务的地址直接采用基地址,使用basicHttpBinding-->
<endpoint address="" binding="basicHttpBinding" contract="SimpleService.IHelloService">
</endpoint>
<!--设置元数据交换节点-->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange">
</endpoint>
<host>
<baseAddresses>
<!--服务的基地址用来访问获取元数据-->
<add baseAddress="http://localhost:9013/HelloService"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="HttpGetEnable">
<!--公开元数据,正是部署时候应该去掉防止元数据泄露-->
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="NoneSecurity">
<!--取消安全验证-->
<security mode="None">
</security>
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
3、启动服务
在服务类中添加如下代码
OnStart方法为服务启动时启动WCF服务,OnStrop方法为服务停止时停止WCF服务。
- 安装Windows服务
设置完成以后就可以安装Windows服务,服务生成以后在bin\debug目录下新建两个文本文件,一个用来安装服务,一个用来删除服务。
Instll.txt里面添加如下代码:
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe E:\文档\visual studio 2013\Projects\20160310WCFWindowsServiceHost\ServiceHost\bin\Debug\ServiceHost.exe
Net Start WCFServiceHost
sc config WCFServiceHost start= auto
pause
UnInstall.txt里面添加如下代码
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u E:\文档\visual studio 2013\Projects\20160310WCFWindowsServiceHost\ServiceHost\bin\Debug\ServiceHost.exe
Pause
这两段代码的具体含意,
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe就是调用.net的一个服务安装程序,来执行服务的安装和删除。【.net的安装程序,默认是装在系统盘下的那个位置,如果有改变,请更改为具体的路径】
此段代码后面跟着的是服务所在的文件夹的路径和服务的可执行文件。我是放在D盘下的,因此写D盘下的路径。可根据需要更改。
Net Start Fanso2o_MonitoringActivity 服务安装好后,立刻执行服务。
sc config Fanso2o_MonitoringActivity start= auto 设置服务的启动方式为自动。其实已经在代码里设置过了,这个地方没必要。
以上全部改好后,将Install.tex、Uninstall.text两个文件的后缀名改为bat,就可以执行服务的安装和删除了。
【注意一:执行此两个文件时,需要用管理员权限执行,否则就会报错。】
【注意二:服务安装后,请不要改动源代码重新生成,否则会删除不掉。如必需改动源代码,请先删除服务,删除后再改动生成,重新安装】
改好以后以管理员权限运行Install.bat就能成功安装服务
在服务列表里面查看一下服务状态
服务已经安装并启动成功。在浏览器中访问WCF服务的基地址
使用WCFTestClient测试一下服务是否可用
如图所示,服务调用成功,证明WCF服务已经部署成功。
- 调试Windows服务
有时候服务有问题我们需要调试,这时候调试Windows服务寄宿的WCF服务就不想普通WCF服务调试那么简单。
首先将Windows服务启动以后,以管理员身份运行VS打开服务代码
确定已经启动了服务
保证以管理员身份运行VS,打开要调试的代码
在要调试的代码上打上断点,不能调试OnStart方法!
在菜单栏中选择调试——附加进程——在进程列表中勾选显示所有用户进程——找到要调试的服务进程——选择附加
然后在WCFTestClient中调用WCF服务
这样就能跟踪调试代码了。