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

  1. 创建WCF服务相关类库

首先创建一个类库程序

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

右键选择添加新建项——在搜索框中输入WCF——选择第一个WCFService并重命名为HelloService。

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

[ServiceContract]

public interface IHelloService

{

[OperationContract]

string DoWork();

}

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

public string GetMessage()

{

return "HelloWorld";

}

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

  1. 创建Windows服务程序

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

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

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

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

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

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

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

  1. 在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服务。

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

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

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

使用WCFTestClient测试一下服务是否可用

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

  1. 调试Windows服务

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

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

确定已经启动了服务

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

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

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

然后在WCFTestClient中调用WCF服务

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

编写寄宿于windows服务的WCF服务的更多相关文章

  1. WCF开发实战系列四:使用Windows服务发布WCF服务

    WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...

  2. autofac 注入普通服务和WCF服务

    using Autofac;using Autofac.Builder;using Autofac.Core; //实现Autofac扩展 public static AutofacRegisterW ...

  3. 一个HttpClient使用Windows认证请求WCF服务的例子

    有个项目需要调用第三方SDK,而SDK获取服务器的已安装的特殊打印机列表返回给调用方. 但我不想依赖这个SDK,因为这个SDK是使用.NET Framework编写的,而我的项目是使用.NET Cor ...

  4. WCF分布式4:客户端访问寄宿在IIS中的WCF服务

    部署过程比较简单,新建一个站点,指向服务的物理路径,设置一个端口.即可. 新建的站点对应一个应用程序池,设置应用程序池中的.NET版本为4.0 写一个测试客户端,访问IIS中的WCF服务,可能会出现, ...

  5. 编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法

    原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Con ...

  6. WCF服务二:创建一个简单的WCF服务程序

    在本例中,我们将实现一个简单的计算服务,提供基本的加.减.乘.除运算,通过客户端和服务端运行在同一台机器上的不同进程实现. 一.新建WCF服务 1.新建一个空白解决方案,解决方案名称为"WC ...

  7. 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代码方式来 ...

  8. WCF系列教程之WCF服务宿主与WCF服务部署

    本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...

  9. WCF初探-8:WCF服务承载 (上)

    前言 任何一个程序的运行都需要依赖一个确定的进程中,WCF服务也不例外.如果使用WCF服务,我们就必须将服务承载于创建它并控制它的上下文和生存期的运行时环境中,承载服务环境的程序,我们称之为宿主.WC ...

随机推荐

  1. 如何正确的在项目中接入微信JS-SDK

    微信JS-SDK的功能 如果你点进来,那么我相信你应该知道微信的JS-SDK可以用来做什么了.微信的官方文档描述如下. 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. ...

  2. 【EF6学习笔记】(二)操练 CRUD 增删改查

    本篇原文链接: Implementing Basic CRUD Functionality 说明:学习笔记参考原文中的流程,为了增加实际操作性,并能够深入理解,部分地方根据实际情况做了一些调整:并且根 ...

  3. ajax实现文档导出及下载

    做导出一直遇到个问题就是不能用ajax实现一步导出文档,即导出加下载.今天突然想到可以分开来做就上网搜了下,发现一篇比较不错的文章(http://www.cnblogs.com/zj0208/p/59 ...

  4. mysql开启general_log查看执行sql

    1.查看是否打开 SHOW variables like "%general_log%"; 2.打开 set global general_log=On 3.查看sql执行 tai ...

  5. Go实用开源库收集

    框架 https://github.com/go-martini/martini 图形验证码 https://github.com/dchest/captcha ORM https://github. ...

  6. MySQL:测试题

    一,表关系的练习测试 请创建如下表关系,并建立相关约束 一,创建表结构数据: 创建的话肯定先创建没有关联的表,老师,课程(关联老师),年级,班级(关联年级),学生(关联班级), 班级任职表 (关联老师 ...

  7. 飞跃式发展的后现代 Python 世界

    飞跃式发展的后现代Python世界 如果现代Python有一个标志性特性,那么简单说来便是Python对自身定义的越来越模糊.在过去的几年的许多项目都极大拓展了Python,并重建了“Python”本 ...

  8. Perl的子程序

    子程序(subroutine) perl中的子程序其实就是自定义函数.它使用sub关键字开头,表示声明一个子程序 子程序名称有独立的名称空间,不会和其它名称冲突 Perl中的子程序中可以定义.引用.修 ...

  9. python的partial()用法说明

    在functools模块中有一个工具partial(),可以用来"冻结"一个函数的参数,并返回"冻结"参数后的新函数. 很简单的解释,也是官方手册给的示例.对于 ...

  10. MySQL系列详解二:MySQL语句操作-技术流ken

    简介 本篇博客将详细讲解mysql的一些常用sql语句操作,例如创建数据库,删除数据库,创建表,修改表,删除表,以及简单查询案例. 关于mysql数据中的SQL的大小写问题 1.不区分大小写 1. s ...