编写寄宿于windows服务的WCF服务

本文转载自https://www.cnblogs.com/enternal/p/5275441.html。

由于业务中有些任务需要在后台静默长期运行,或者有些服务队响应的要求比较苛刻,这样的WCF服务就不适合寄宿于IIS中。IIS每隔一段时间w3wp进程会闲置超时,造成服务的运行停止,因此这种耗时或者定时任务更加适合以windows服务的形式作为后台进程静默运行。

  1. 创建WCF服务相关类库

首先创建一个类库程序

https://i-blog.csdnimg.cn/blog_migrate/8b82284a89ad3362d6a9dcef5eb518be.png

在类库程序中添加WCF服务文件

右键选择添加新建项——在搜索框中输入WCF——选择第一个WCFService并重命名为HelloService。 https://i-blog.csdnimg.cn/blog_migrate/9c44f14e3e274350c56137f12d5ac766.png

删除类库中的App.config配置文件,这个配置文件用不到。修改IHelloService接口中方法的名称和返回值。默认程序返回值为空不利于我们测试。修改后的代码如下:

[ServiceContract]

public interface IHelloService

{

[OperationContract]

string DoWork();

}

同时修改接口实现类HelloService中的方法,修改后的代码如下

public string GetMessage()

{

return "HelloWorld";

}

这样WCF服务就创建好了,下面接着创建WCF的宿主程序——Windows服务

  1. 创建Windows服务程序

右键选择解决方案——添加——新建项——选择Windows Service

https://i-blog.csdnimg.cn/blog_migrate/5583500435adb5128602c01794ed12b1.png

创建完成后删除默认生成的服务类Service1,我们自己创建一个。右键选择HelloService——添加——新建项——选择Windows Service

https://i-blog.csdnimg.cn/blog_migrate/2aeac092dad761b0acabf6a5d43d9d5e.png

创建完成后在服务设计界面上点击右键选择添加安装程序,添加服务的安装选项

https://i-blog.csdnimg.cn/blog_migrate/d8d05a7457be669c753a6746a5cc9b16.png

添加完成后,需要设置服务的启动方式和运行账户。首先在服务安装程序的设计界面上右键选择serviceInstallser1——属性——在右面的属性对话框中将StartType设置为Automatic

https://i-blog.csdnimg.cn/blog_migrate/46070ec5d20f92858fe1bc9c96b77dac.png

https://i-blog.csdnimg.cn/blog_migrate/5a65d1d85dd39a62f0cbdcc5c5980ec0.png

在服务安装程序设计界面上右键选择serviceProcessInstaller1——属性——在右边的属性对话框中设置Account属性的值为LocalSystem,如下图所示

https://i-blog.csdnimg.cn/blog_migrate/b1050d5e8616e8e43569370988ca26e7.png

以上设置完成后,修改windows服务程序中Program类中Main方法中要创建的服务实类为WCFServiceHost,否则编译不过。

https://i-blog.csdnimg.cn/blog_migrate/2320062723924bd9b0e3f41d5bea4f13.png

这样服务在安装启动以后就会以LocalSystem账户的形式在后台自动运行

  1. 在Windows服务中寄宿WCF服务

1、在windows服务项目中添加System.Service.Model和WCF服务类库

https://i-blog.csdnimg.cn/blog_migrate/1d743554f939ce00b67d2514862add80.png

https://i-blog.csdnimg.cn/blog_migrate/3fcd3807a86fecd5db4c521f5451a85a.png

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、启动服务

在服务类中添加如下代码

https://i-blog.csdnimg.cn/blog_migrate/a86e8021bab33ee5b737aa592850f438.png

 

OnStart方法为服务启动时启动WCF服务,OnStrop方法为服务停止时停止WCF服务。

  1. 安装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就能成功安装服务

https://i-blog.csdnimg.cn/blog_migrate/6bbb1c4545a755f39641da1560c9d46a.png

在服务列表里面查看一下服务状态

https://i-blog.csdnimg.cn/blog_migrate/364eeb8e3405df81a0f147b76769f7ff.png

服务已经安装并启动成功。在浏览器中访问WCF服务的基地址

https://i-blog.csdnimg.cn/blog_migrate/b1634e1b52b4e101645446ad537cb2ed.png使用WCFTestClient测试一下服务是否可用

https://i-blog.csdnimg.cn/blog_migrate/28843bfbb75c8bc9ee806843ff60198e.png

如图所示,服务调用成功,证明WCF服务已经部署成功。

  1. 调试Windows服务

有时候服务有问题我们需要调试,这时候调试Windows服务寄宿的WCF服务就不想普通WCF服务调试那么简单。

首先将Windows服务启动以后,以管理员身份运行VS打开服务代码

确定已经启动了服务

https://i-blog.csdnimg.cn/blog_migrate/af7fbcee16ef497990f2e4f922f50c92.png

保证以管理员身份运行VS,打开要调试的代码

https://i-blog.csdnimg.cn/blog_migrate/85195ba7e16a80706ccfb09812958f4b.png

在要调试的代码上打上断点,不能调试OnStart方法!

在菜单栏中选择调试——附加进程——在进程列表中勾选显示所有用户进程——找到要调试的服务进程——选择附加

https://i-blog.csdnimg.cn/blog_migrate/cf9203a4840981fa792a2018c8a3da83.png

 

https://i-blog.csdnimg.cn/blog_migrate/020774f13297bb0e5dc2d52f3f029ba8.png

 

然后在WCFTestClient中调用WCF服务

https://i-blog.csdnimg.cn/blog_migrate/a6acc959ba2377cfbb0b977bd6353a37.png

这样就能跟踪调试代码了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值