由于业务中有些任务需要在后台静默长期运行,或者有些服务队响应的要求比较苛刻,这样的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. 缓存日志截取字段上传FTP

    #!/bin/bash awk '{print $3,$4,$5,$6,$9,$11,$12,$14,$15,$18}' /usr/local/tcacheserver/var/log/traffic ...

  2. RocketMQ事务消息实现分析

    这周RocketMQ发布了4.3.0版本,New Feature中最受关注的一点就是支持了事务消息: 今天花了点时间看了下具体的实现内容,下面是简单的总结. RocketMQ事务消息概要 通过冯嘉发布 ...

  3. 全网最详细的最新稳定OSSEC搭建部署(ossec-server(CentOS7.X)和ossec-agent(CentOS7.X))(图文详解)

    不多说,直接上干货! 前言 写在前面的话,网上能够找到一些关于ossec方面的资料,虽然很少,但是总比没有强,不过在实际的使用过程中还是会碰到许多稀奇古怪的问题.整理整理我的使用过程,就当做一篇笔记吧 ...

  4. 基础编程复习:输出n以内的所有素数

    暴力遍历:对于1~n以内的每一数i 每一个i只需要考虑2~i开根号以内是否有可以让i整除的数,即(i%x==0)只要满足就不是素数 否则输出 #include<iostream> #inc ...

  5. NewLife.Redis基础教程

    X组件缓存架构以ICache接口为核心,包括MemoryCache.Redis和DbCache实现,支持FX和netstandard2.0!后续例程与使用说明均以Redis为例,各缓存实现类似. Re ...

  6. TensorFlow中的并行执行引擎——StreamExecutor框架

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 在前一篇文章中,我们梳理了TensorFlow中各种异构Device的添加和注 ...

  7. C#静态成员静态类。

    1. 在静态类中,所包含的所有成员必须是静态的.但不是所有静态成员都必须写在静态类中.       实例成员属于具体的对象,静态成员是属于类的.所以访问静态成员的时候不能通过对象来访问,只能通过类名直 ...

  8. cronolog日志切割catalina.out

    cronolog日志切割catalina.out (一)解压安装cronolog 1:wget  https://files.cnblogs.com/files/crazyzero/cronolog- ...

  9. software testing

    Software Testing Software testing is the process of evaluation a software item to detect differences ...

  10. clean 伪目标

    下面的"clean"目标,是一个"伪目标",      clean:              rm *.o temp  我们生成了许多文件编译文件,我们也应该 ...