编写寄宿于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 ...
随机推荐
- django 模板层排序 class Meta 添加信息
class weeks(models.Model): #星期信息 stu = models.ForeignKey(students,on_delete=models.CASCADE) weeklist ...
- android项目架构 -----Android 知识体系与常用第三方框架
好东西值得分享 ,这是网络上总结的一些开源的东西直接就拿过来了 .... Android通用流行框架大全 先把这张图放在这 ,先来谈一谈项目结构 .我喜欢将东西按模块来划分: 都知道module . ...
- Android--UI之Gallery
前言 这篇博客讲解一下Android开发中,Gallery控件的使用,这是一个画廊视图,用于展示一组图片,用固定在中间位置的水平滚动列表显示列表项的视图.Android最新的API文档中了解到,在An ...
- 微信小程序自定义navigationBar标题栏
小程序默认使用的navigationBar只能设置颜色.文字,左侧返回按钮也是不可改变的,若要实现下方效果有解决方案,但是也有一定的问题. 1.更改app.json "window" ...
- Elasticsearch实践(二):搜索
本文以 Elasticsearch 6.2.4为例. 经过前面的基础入门,我们对ES的基本操作也会了.现在来学习ES最强大的部分:全文检索. 准备工作 批量导入数据 先需要准备点数据,然后导入: wg ...
- golang的字符串拼接
常用拼接方法 字符串拼接在日常开发中是很常见的需求,目前有两种普遍做法: 一种是直接用 += 来拼接 s1 := "Hello" s2 := "World" s ...
- WPF系列(1)WPF和XAML基础
终于下定决心开始更新WPF一个系列的文章,这里主要是出于两个目的,一是自己对所学的知识有一个系统的总结,二十希望能对其他人有些帮助,如果您觉得我写的不好,欢迎提意见. 那么既然我要开始写WPF,那我们 ...
- Docker虚拟机理论
Docker虚拟机架构 ◆ Docker架构 Docker创建的所有虚拟实例共用同一个Linux内核,对硬件占用较小,属于轻量级虚拟机 Docker镜像与容 ...
- centos 安装sbt
1.yum install sbt 2.如果不行,则 curl https://bintray.com/sbt/rpm/rpm > bintray-sbt-rpm.repo sudo mv bi ...
- 《Office 365开发入门指南教程》正式上线,限时优惠和邀请分享推广
我很高兴地通知大家,<Office 365 开发入门指南教程>已经正式在网易云课堂上线,你可以通过直接访问 https://aka.ms/office365devlesson 这个短地址 ...