编写寄宿于windows服务的WCF服务
由于业务中有些任务需要在后台静默长期运行,或者有些服务队响应的要求比较苛刻,这样的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服务

这样就能跟踪调试代码了。
编写寄宿于windows服务的WCF服务的更多相关文章
- WCF开发实战系列四:使用Windows服务发布WCF服务
WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...
- autofac 注入普通服务和WCF服务
using Autofac;using Autofac.Builder;using Autofac.Core; //实现Autofac扩展 public static AutofacRegisterW ...
- 一个HttpClient使用Windows认证请求WCF服务的例子
有个项目需要调用第三方SDK,而SDK获取服务器的已安装的特殊打印机列表返回给调用方. 但我不想依赖这个SDK,因为这个SDK是使用.NET Framework编写的,而我的项目是使用.NET Cor ...
- WCF分布式4:客户端访问寄宿在IIS中的WCF服务
部署过程比较简单,新建一个站点,指向服务的物理路径,设置一个端口.即可. 新建的站点对应一个应用程序池,设置应用程序池中的.NET版本为4.0 写一个测试客户端,访问IIS中的WCF服务,可能会出现, ...
- 编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法
原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Con ...
- WCF服务二:创建一个简单的WCF服务程序
在本例中,我们将实现一个简单的计算服务,提供基本的加.减.乘.除运算,通过客户端和服务端运行在同一台机器上的不同进程实现. 一.新建WCF服务 1.新建一个空白解决方案,解决方案名称为"WC ...
- WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...
- WCF系列教程之WCF服务宿主与WCF服务部署
本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...
- WCF初探-8:WCF服务承载 (上)
前言 任何一个程序的运行都需要依赖一个确定的进程中,WCF服务也不例外.如果使用WCF服务,我们就必须将服务承载于创建它并控制它的上下文和生存期的运行时环境中,承载服务环境的程序,我们称之为宿主.WC ...
随机推荐
- python通过snmp协议运用多线程获取多台主机网卡信息,写入数据库
#-*- coding:utf-8 -*- import netsnmp class SnmpClass(object): """ SNMP ""&q ...
- Java 容器 & 泛型:六、容器讲到为什么要使用泛型
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket ArrayList是集合类中无处不在的,泛型也是,泛型对集合类尤其有用.但是为啥要使用泛型?理解好了这 ...
- 数据量你造吗-JAVA分页
原创地址: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks 学习的心态第一,解行要相应.其实<弟子规>在“余力 ...
- SpringBoot2.0源码分析(四):spring-data-jpa分析
SpringBoot具体整合rabbitMQ可参考:SpringBoot2.0应用(四):SpringBoot2.0之spring-data-jpa JpaRepositories自动注入 当项目中存 ...
- 权限控制和OAuth
目录 1 权限控制是什么 1.1 ACL 1.2 RBAC 1.2.1 名词术语 1.2.2 RBAC定义 1.2.3 RBAC分类 1.2.3.1 RBAC0 1.2.3.2 RBAC1 1.2.3 ...
- leetcode — search-for-a-range
import java.util.Arrays; /** * Source : https://oj.leetcode.com/problems/search-for-a-range/ * * Cre ...
- 【转载】LINUX 和 WINDOWS 内核的区别
LINUX 和 WINDOWS 内核的区别 [声明:欢迎转载,转载请注明出自CU ACCESSORY http://linux.chinaunix.net/bbs/thread-1153868-1-1 ...
- 动态代理实现AOP
代理 代理顾名思义:代为处理.不是对目标对象的直接操作,而是通过代理对目标对象进行包装,此时可以在目标对象的基础上添加额外的操作以满足业务需求.图示 分类:动态代理.静态代理. 代理三要素:共同接口. ...
- spring学习(四) ———— 整合web项目(SSH)
清楚了spring的IOC 和 AOP,最后一篇就来整合SSH框架把,记录下来,以后应该会用的到. --WH 一.web项目中如何使用spring? 当tomcat启动时,就应该加载spring的配置 ...
- SpringMVC入门学习三
今天是Springmvc学习的第三天,今天我将主要介绍一下: 常用注解的使用 关于非post.get请求的处理 文件上传与下载 拦截器 常用注解的使用 老大在此 @Controller @Cont ...