一、WCF服务应用程序与WCF服务库

  我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”。

  WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定义,可以直接看到运行的效果。此项目模板基于IIS托管的程序,如本系列的第一节所示。在开发基于IIS托管的WCF服务程序时,比较多见,自学的时候也可以使用这种类型,简单易懂。

  WCF服务库,可以认为是一个包含WCF服务以及契约定义的类库。不能直接运行,你可以在其他项目里引用,在宿主里启用托管这个库,有点类似于我们在Web项目中应用的类库。考虑WCF服务设计的时候,服务类的定义为单独的库,可以为其它项目使用。提高代码的复用性。

  当然你也可以修改这些代码,比如把WCF服务程序里的类,移到一个单独的类库里,或是把类库里的类移到WCF服务程序中。

二、概述

  通过前面的介绍我们知道,WCF在运行时必寄宿在“宿主程序”之上,WCF本身不能够独自运行(每个WCF服务必须宿主在一个Windows进程中)。.net 提供了多种宿主供WCF运行,WCF还是非常灵活的。

  WCF的宿主可以是 Windows 服务、COM+应用程序、WAS(Windows Activation Services,Windows进程激活服务)或IIS、Windows应用程序,或简单的控制台应用程序及任何.net程序。

  这节的示例我们重新建立WCF类库项目为例做示例,名称为:WCFLibrary,并删除自动生成的两个文件(IService1.cs、Service1.cs)。如下图所示:

  鼠标右键查看项目属性。我们发现,其实“WCF类库项目”与我们平时建立的 “类库项目”都是类库,只不过多了WCF的类库项目在新建时多了两个dll的引用(System.ServiceModel.dll、 System.Runtime.Serialization.dll)和一个自动生成的配置文件(该配置文件只用于调试时使用,在WCF寄宿以后会应用宿 主的配置文件与其他应用程序通信)。这更说明了我们在做分式程序开发的时候与我们平时开发的应用程序没有多大的区别,只要我们在应用程序间通信时“符合 WCF的约定”即可。

  服务端我们还和第一个教程一样(IUser接口与User实现),只建立一个方法做为我们调用的示例代码如下:

 1 //添加引用
2 using System.ServiceModel;
3
4 namespace WCFLibrary
5 {
6 [ServiceContract]
7 interface IUser
8 {
9 [OperationContract]
10 string ShowName(string name);
11 }
12 }
13
14 namespace WCFLibrary
15 {
16 class User : IUser
17 {
18 public string ShowName(string name)
19 {
20 string wcfName = string.Format("WCF服务,显示姓名:{0}", name);
21 return wcfName;
22 }
23 }
24 }

由于原来的契约为IService,现在的为IUser,所以配置文件有两处要修改为:

<service name="WCFLibrary.User">

<endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser">

点击“F5“运行效果如下图所示说明成功:

二、IIS宿主

  我们在第一节中,把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以依靠IIS来管理宿主进程的生命周期。在开发和使用的过程与Web Service非常相似。

  具体请参见本系列的第一节课程

、控制台应用程序宿主

  建立宿主

  (1)在解决方案下新建控制台输出项目 WCFHost_Console。

  (2)添加 System.ServiceModel.dll 的引用。

  (3)添加 WCF 服务类库(WCFLibrary)的项目引用。

  (4)创建宿主程序,代码如下:

 1 using System;
2 using WCFLibrary;
3 using System.ServiceModel;
4 using System.ServiceModel.Description;
5
6 namespace WCFHost_Console
7 {
8 class Program
9 {
10 static void Main(string[] args)
11 {
12 //创建宿主的基地址
13 Uri baseAddress = new Uri("http://localhost:8080/User");
14 //创建宿主
15 using (ServiceHost host = new ServiceHost(typeof(User), baseAddress))
16 {
17 //向宿主中添加终结点
18 host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "");
19 //将HttpGetEnabled属性设置为true
20 ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
21 smb.HttpGetEnabled = true;
22 //将行为添加到Behaviors中
23 host.Description.Behaviors.Add(smb);
24 //打开宿主
25 host.Open();
26 Console.WriteLine("WCF中的HTTP监听已启动....");
27 Console.ReadLine();
28 host.Close();
29 }
30 }
31 }
32 }

  (5)运行宿主程序[在客户端调用时要先运行宿主程序],如下图所示:

  说明宿主建立成功。在上例中用到"ServiceHost"类,这里只是简单的应用,具体请查看"MSDN ServiceHost"

  建立客户端

  (1)重新建立解决方案-->Web应用程序项目。

  (2)添加对服务的引用(在引用上右键-->输入我们定义的服务宿主的基地址(此处为:http://localhost:8080/User)-->前往-->确定),具体请看第一节。

  (3)测试程序如下图所示说明成功(注意:一定要先运行我们的宿主程序才行,如果宿主没有打开的话会报错:由于目标计算机积极拒绝,无法连接。)。

  在这个示例中我们把Endpoint中的ABC,基地址,Behaviors等都直接写在了代码里,但实际应用过程中都是去依赖配置文件,为了对比说明我们下面的例子中会使用配置文件。

四、Windows应用程序宿主 

  建立宿主

  (1)在解决方案下新建Windows窗体应用程序项目 WCFHost_Form。

  (2)添加 System.ServiceModel.dll 的引用。

  (3)添加 WCF 服务类库(WCFLibrary)的项目引用。

  (4)添加应用程序配置文件App.config。

  (5)创建宿主程序MainForm窗体,并修改App.config,代码如下:

 1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3 <system.serviceModel>
4 <services>
5 <service name="WCFLibrary.User">
6 <host>
7 <baseAddresses>
8 <add baseAddress="http://localhost:8081/User"/>
9 </baseAddresses>
10 </host>
11 <endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser"></endpoint>
12 </service>
13 </services>
14 <behaviors>
15 <serviceBehaviors>
16 <behavior>
17 <serviceMetadata httpGetEnabled="True"/>
18 <serviceDebug includeExceptionDetailInFaults="False"/>
19 </behavior>
20 </serviceBehaviors>
21 </behaviors>
22 </system.serviceModel>
23 </configuration>
24
25
26 using System;
27 using WCFLibrary;
28 using System.ServiceModel;
29 using System.Windows.Forms;
30 using System.Configuration;
31
32 namespace WCFHost_Form
33 {
34 public partial class MainForm : Form
35 {
36 ServiceHost host;
37
38 public MainForm()
39 {
40 InitializeComponent();
41 }
42
43 //应用程序加载
44 private void MainForm_Load(object sender, EventArgs e)
45 {
46 host = new ServiceHost(typeof(User));
47 //打开宿主
48 host.Open();
49 this.lblState.Text = "WCF中的HTTP监听已启动....";
50 }
51
52 //应用程序关闭
53 private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
54 {
55 host.Close();
56 }
57 }
58 }

  运行程序如下图所示:

  建立客户端

  同上边的Console程序一样,这里要引用的地址为:<add baseAddress="http://localhost:8081/User"/>

  在这个例子中与Console应用程序不同的是,我们在Console配置是直接写在程序中的,而在本例中我们应用的是配置文件,区别在于如果写在配置文件中程序运行时直接到配置文件里取出相关的配置节去创建ServiceHost类。

五、WAS宿主

  Windows 进程激活服务 (WAS) 概述  

  IIS7允许通过HTTP外的协议进行激活和网络通信。此环境适合开发可通过 WCF支持的任何网络协议(包括http、net.tcp、net.pipe、net.msmq)进行通信的WCF服务。部署简单、管理方便,这些网络协 议在部署时可像Http一样,直接丢到IIS7上即可,我们在下面的例子中以net.tcp为协议为例。IIS7以下的版本只能支持Http的通信。

  1、确保已安装IIS7的激活组件

  在应用WAS宿主时,必须确保IIS7的激活组件安装好。打开“控制面板”-->“打开或关闭Windows功能”-->“功能”,我的机器上已经安装过,如下图所示(WCF激活与非WCF激活):

  如果没有安装,点击“添加新功能”,然后勾选“WCF激活”,如下图所示:

  安装成功后我们打开IIS,点击“默认网站(任一个网站即可)”-->“绑定”-->“添加”,在类型中会出现非IIS支持的其他类型。如下图所示

  说明安装成功。

  2、添加net.tcp的网站绑定

  在上图中,我们选择类型net.tcp,然后在绑定信息中填写“808:*”,点击确定。

  3、开通net.tcp的协议 

  在安装成功并且在指定的网站上绑定了net.tcp以后,我们还要开通.net.tcp协议,点击我们要部署WCF的网站,在IIS管理器的操作功能区有一项“高级设置”点击后出现如下图所示高级配置的窗体

  在启用的协议中添加net.tcp协议(原来只对http协议支持,现在把tcp协议追加上去),中间用逗号隔离开,如上图所示。

  注意:这几个步骤一个也不能少,否则会出现:“找不到具有绑定 NetTcpBinding 的终结点的与方案 net.tcp 匹配的基址。注册的基址方案是 [http]”的错误信息。

  4、建立服务程序

  (1)在解决方案下新建WCF服务应用程序项目 WCFHost_WAS。

  (2)建立IUser与User,代码同例二一样。

  (3)修改配置文件代码如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <configuration>
3 <system.serviceModel>
4 <bindings>
5 <netTcpBinding>
6 <binding name="netTcpBindConfig">
7 <security mode="None">
8 <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
9 <message clientCredentialType="Windows" />
10 </security>
11 </binding>
12 </netTcpBinding>
13 </bindings>
14 <services>
15 <service behaviorConfiguration="MyBehavior" name="WCFHost_WAS.User">
16 <endpoint address="" binding="netTcpBinding" contract="WCFHost_WAS.IUser" bindingConfiguration="netTcpBindConfig"></endpoint>
17 <!--元数据交换的终结点-->
18 <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" ></endpoint>
19 </service>
20 </services>
21 <behaviors>
22 <serviceBehaviors>
23 <behavior name="MyBehavior" >
24 <serviceMetadata/>
25 <serviceDebug includeExceptionDetailInFaults="true" />
26 <dataContractSerializer maxItemsInObjectGraph="6553600"/>
27 </behavior>
28 </serviceBehaviors>
29 </behaviors>
30 </system.serviceModel>
31
32 </configuration>

  (5)部署服务

  像其他的Web应用程序一样,把相关的文件丢到服务器端指定目录即可。

  鼠标右键浏览User.svc,如现如下所示:

  说明部署成功,如上所示的服务地址为:net.tcp://服务器名/User.svc/mex

  (6)建立客户端

  建立客户端也与其他的一样,如下图所示:

  我们此时看客户端的配置文件:

    <client>
<endpoint address="http://localhost:8080/User" binding="wsHttpBinding"
contract="WCFHost_Console.IUser" />
<endpoint address="http://localhost:8081/User" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IUser" contract="WCFHost_Form.IUser"
name="WSHttpBinding_IUser">
<identity>
<userPrincipalName value="WIN-EOUTAA4CP4O\Administrator" />
</identity>
</endpoint>
<endpoint address="net.tcp://win-eoutaa4cp4o/User.svc" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IUser" contract="WCFHost_WAS.IUser"
name="NetTcpBinding_IUser" />
</client>

  我们在一个Web应用程序中调用了三种不同宿主的服务。 

七、总结

  通过上面的几个例子,我们实现了控制台宿主、Form宿主、WAS宿主(基于TCP协议)的实现。在实际的开发过程中,有时候我们还会用到基于Windows服务的宿主,但大部份都使用IIS做宿主,方便、快捷。

八、代码下载

  10 WCF 教程

九、版权

  转载请注明出处:http://www.cnblogs.com/iamlilinfeng

WCF入门教程三[WCF的宿主]的更多相关文章

  1. 无废话WCF入门教程三[WCF的宿主]

    一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定 ...

  2. 【转】WCF入门教程三[WCF的宿主]

    一.WCF服务应用程序与WCF服务库 我们在平时开发的过程中常用的项目类型有“WCF 服务应用程序”和“WCF服务库”. WCF服务应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定 ...

  3. WCF入门教程:WCF基础知识问与答(转)

    学习WCF已有近两年的时间,其间又翻译了Juval的大作<Programming WCF Services>,我仍然觉得WCF还有更多的内容值得探索与挖掘.学得越多,反而越发觉得自己所知太 ...

  4. WCF入门教程1——WCF简要介绍

    什么是WCF Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windo ...

  5. WCF入门教程3——WCF通信模式

    本章内容 请求/响应模式 单工模式 双工模式 WCF异步调用 请求与响应模式 请求/响应     请求/响应通信是指客户端向服务端发送消息后,服务端会向客户端发送响应.这也意味着在接收到服务的响应以前 ...

  6. WCF入门教程二[WCF应用的通信过程]

    一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的 ...

  7. 无废话WCF入门教程二[WCF应用的通信过程]

    一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的 ...

  8. 【转】WCF入门教程二[WCF应用的通信过程]

    一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的 ...

  9. WCF入门教程五[WCF的通信模式]

    一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...

随机推荐

  1. hdu 2070

    ps:...递推..还是给出公式那种... 代码: #include "stdio.h" #define LL long long LL dp[]; int main(){ int ...

  2. 数据结构《9》----Threaded Binary Tree 线索二叉树

    对于任意一棵节点数为 n 的二叉树,NULL 指针的数目为  n+1 , 线索树就是利用这些 "浪费" 了的指针的数据结构. Definition: "A binary ...

  3. 层次分析模型(AHP)及其MATLAB实现

    今天用将近一天的时间学习了层次分析模型(AHP),主要参考了一份pdf,这个网站,和暨南大学章老师的课件,现写出一些自己总结的要点. 一.层次分析法的基本步骤: 角度一: 实际问题——分解——> ...

  4. 在php中需要用到的mysql数据库的简单操作

    1.数据库连接 1.1用windows命令行链接数据库服务器 几个DOS命令 在DOS环境下命令后面没有分号,在MySQL环境下,命令后面有分号 进入盘符: 语法:盘符: 进入盘符下的某个文件夹 语法 ...

  5. lower_bound和upper_bound算法

    参考:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html ForwardIter lower_bound(ForwardIte ...

  6. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  7. How to install more voices to Windows Speech?

    !!!WARNING!!! This involves manual edits to your registry. If you mess it up, don't blame me. Do at ...

  8. 什么是JavaScript闭包终极全解之一——基础概念

    本文转自:http://www.cnblogs.com/richaaaard/p/4755021.html 什么是JavaScript闭包终极全解之一——基础概念 “闭包是JavaScript的一大谜 ...

  9. vs2012 + cocos2d-x 2.1.5 + win7开发环境搭建步骤

    先要让vs具备cocos2d-x项目的模板,以此可以创建新的项目(1-5步),然后把相关的源码库文件和动态连接库都拷贝到自己的项目中,以使项目可以正常运行(6-7步). 1,打开vs,设置TestCp ...

  10. iOS学习笔记---c语言第八天

    指针 首先将变量a的地址存放在另一个变量中,比如存放在变量b中,然后通过变量b来间接引用变量a,间接读写变量a的值.用来存放变量地址的变量,就称为"指针变量" int *p=nul ...