一、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. 1 //添加引用
  2. 2 using System.ServiceModel;
  3. 3
  4. 4 namespace WCFLibrary
  5. 5 {
  6. 6 [ServiceContract]
  7. 7 interface IUser
  8. 8 {
  9. 9 [OperationContract]
  10. 10 string ShowName(string name);
  11. 11 }
  12. 12 }
  13. 13
  14. 14 namespace WCFLibrary
  15. 15 {
  16. 16 class User : IUser
  17. 17 {
  18. 18 public string ShowName(string name)
  19. 19 {
  20. 20 string wcfName = string.Format("WCF服务,显示姓名:{0}", name);
  21. 21 return wcfName;
  22. 22 }
  23. 23 }
  24. 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. 1 using System;
  2. 2 using WCFLibrary;
  3. 3 using System.ServiceModel;
  4. 4 using System.ServiceModel.Description;
  5. 5
  6. 6 namespace WCFHost_Console
  7. 7 {
  8. 8 class Program
  9. 9 {
  10. 10 static void Main(string[] args)
  11. 11 {
  12. 12 //创建宿主的基地址
  13. 13 Uri baseAddress = new Uri("http://localhost:8080/User");
  14. 14 //创建宿主
  15. 15 using (ServiceHost host = new ServiceHost(typeof(User), baseAddress))
  16. 16 {
  17. 17 //向宿主中添加终结点
  18. 18 host.AddServiceEndpoint(typeof(IUser), new WSHttpBinding(), "");
  19. 19 //将HttpGetEnabled属性设置为true
  20. 20 ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
  21. 21 smb.HttpGetEnabled = true;
  22. 22 //将行为添加到Behaviors中
  23. 23 host.Description.Behaviors.Add(smb);
  24. 24 //打开宿主
  25. 25 host.Open();
  26. 26 Console.WriteLine("WCF中的HTTP监听已启动....");
  27. 27 Console.ReadLine();
  28. 28 host.Close();
  29. 29 }
  30. 30 }
  31. 31 }
  32. 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. 1 <?xml version="1.0" encoding="utf-8" ?>
  2. 2 <configuration>
  3. 3 <system.serviceModel>
  4. 4 <services>
  5. 5 <service name="WCFLibrary.User">
  6. 6 <host>
  7. 7 <baseAddresses>
  8. 8 <add baseAddress="http://localhost:8081/User"/>
  9. 9 </baseAddresses>
  10. 10 </host>
  11. 11 <endpoint address="" binding="wsHttpBinding" contract="WCFLibrary.IUser"></endpoint>
  12. 12 </service>
  13. 13 </services>
  14. 14 <behaviors>
  15. 15 <serviceBehaviors>
  16. 16 <behavior>
  17. 17 <serviceMetadata httpGetEnabled="True"/>
  18. 18 <serviceDebug includeExceptionDetailInFaults="False"/>
  19. 19 </behavior>
  20. 20 </serviceBehaviors>
  21. 21 </behaviors>
  22. 22 </system.serviceModel>
  23. 23 </configuration>
  24. 24
  25. 25
  26. 26 using System;
  27. 27 using WCFLibrary;
  28. 28 using System.ServiceModel;
  29. 29 using System.Windows.Forms;
  30. 30 using System.Configuration;
  31. 31
  32. 32 namespace WCFHost_Form
  33. 33 {
  34. 34 public partial class MainForm : Form
  35. 35 {
  36. 36 ServiceHost host;
  37. 37
  38. 38 public MainForm()
  39. 39 {
  40. 40 InitializeComponent();
  41. 41 }
  42. 42
  43. 43 //应用程序加载
  44. 44 private void MainForm_Load(object sender, EventArgs e)
  45. 45 {
  46. 46 host = new ServiceHost(typeof(User));
  47. 47 //打开宿主
  48. 48 host.Open();
  49. 49 this.lblState.Text = "WCF中的HTTP监听已启动....";
  50. 50 }
  51. 51
  52. 52 //应用程序关闭
  53. 53 private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
  54. 54 {
  55. 55 host.Close();
  56. 56 }
  57. 57 }
  58. 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. 1 <?xml version="1.0" encoding="utf-8"?>
  2. 2 <configuration>
  3. 3 <system.serviceModel>
  4. 4 <bindings>
  5. 5 <netTcpBinding>
  6. 6 <binding name="netTcpBindConfig">
  7. 7 <security mode="None">
  8. 8 <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
  9. 9 <message clientCredentialType="Windows" />
  10. 10 </security>
  11. 11 </binding>
  12. 12 </netTcpBinding>
  13. 13 </bindings>
  14. 14 <services>
  15. 15 <service behaviorConfiguration="MyBehavior" name="WCFHost_WAS.User">
  16. 16 <endpoint address="" binding="netTcpBinding" contract="WCFHost_WAS.IUser" bindingConfiguration="netTcpBindConfig"></endpoint>
  17. 17 <!--元数据交换的终结点-->
  18. 18 <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" ></endpoint>
  19. 19 </service>
  20. 20 </services>
  21. 21 <behaviors>
  22. 22 <serviceBehaviors>
  23. 23 <behavior name="MyBehavior" >
  24. 24 <serviceMetadata/>
  25. 25 <serviceDebug includeExceptionDetailInFaults="true" />
  26. 26 <dataContractSerializer maxItemsInObjectGraph="6553600"/>
  27. 27 </behavior>
  28. 28 </serviceBehaviors>
  29. 29 </behaviors>
  30. 30 </system.serviceModel>
  31. 31
  32. 32 </configuration>

  (5)部署服务

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

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

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

  (6)建立客户端

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

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

  1. <client>
  2. <endpoint address="http://localhost:8080/User" binding="wsHttpBinding"
  3. contract="WCFHost_Console.IUser" />
  4. <endpoint address="http://localhost:8081/User" binding="wsHttpBinding"
  5. bindingConfiguration="WSHttpBinding_IUser" contract="WCFHost_Form.IUser"
  6. name="WSHttpBinding_IUser">
  7. <identity>
  8. <userPrincipalName value="WIN-EOUTAA4CP4O\Administrator" />
  9. </identity>
  10. </endpoint>
  11. <endpoint address="net.tcp://win-eoutaa4cp4o/User.svc" binding="netTcpBinding"
  12. bindingConfiguration="NetTcpBinding_IUser" contract="WCFHost_WAS.IUser"
  13. name="NetTcpBinding_IUser" />
  14. </client>

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

七、总结

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

八、代码下载

  10 WCF 教程

原文地址:http://www.cnblogs.com/iamlilinfeng/archive/2012/10/01/2706353.html

【转】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. Python isspace() 方法

    描述 Python isspace() 方法检测字符串是否只由空格组成. 语法 isspace() 方法语法: S.isspace() 参数 无. 返回值 如果字符串中至少有一个字符,并且所有字符都是 ...

  2. Jeecg 如何执行批量insert或者update操作,高效率

    方法:org.jeecgframework.core.common.dao.jdbc.SimpleJdbcTemplate.batchUpdate     原理: 基于springjdbc封装,批量提 ...

  3. 【Android】18.1 利用安卓内置的定位服务实现位置跟踪

    分类:C#.Android.VS2015: 创建日期:2016-03-04 一.安卓内置的定位服务简介 通常将各种不同的定位技术称为位置服务或定位服务.这种服务是通过电信运营商的无线电通信网络(如GS ...

  4. 在IntentService中使用Toast与在Service中使用Toast的异同

    1. 表象 Service中能够正常显示Toast,IntentService中不能正常显示Toast.在2.3系统上,不显示toast,在4.3系统上,toast显示.可是不会消失. 2. 问题分析 ...

  5. JNI-获取Java对象的成员变量-GeInttField()

    例: 在Java中定义一个属性,然后用C语言将其设置成另外的值,并输出出来. Java代码: Person.java package com.yuneec.demo; public class Per ...

  6. SourceInsight-查看java中接口对应的实现类

    1.双击选中需要查看的接口名称,然后右击选择“Show in Relation Window” 2.然后在右侧会弹出一个Relation的窗口 如果没有列出对应的实现类,可以在接口名上再次右击,依次选 ...

  7. 中间件监控之Apache

    补 系统架构 nginx接到请求后把请求转发到tomcat,还有种方式是转发到apache(php项目),或者其他语言的应用服务器(放置我们的项目) ngnix:是web服务器,接受和转发请求用的,不 ...

  8. 利用ForgeryPy生成虚拟数据

    在程序研发过程中,我们往往需要大量的虚拟实验数据.Python中有多个包可以用于生成虚拟数据,其中功能较为完善的是ForgeryPy. 1 安装 采用pip进行安装: pip install Forg ...

  9. singer页左侧滚动的时候右侧跟随高亮显示

    1.封装scroll.vue的listenScroll属性和方法,用来确定监听listview.vue的滚动事件 2.将listview.vue的listenScroll属性默认设置为true; 3. ...

  10. mysql 5.7.14 安装配置方法图文教程(转)

    http://www.jb51.net/article/90259.htm ******************************** 因笔者个人需要需要在本机安装Mysql,先将安装过程记录如 ...