首页 > 代码库 > WCF入门教程二[WCF应用的通信过程]

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

 

一、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 WCFLibrary15 {16     class User : IUser17     {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“运行效果如下图所示说明成功:

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

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

 

、控制台应用程序宿主

 

  建立宿主

 

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

 

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

 

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

 

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

 

 

  (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属性设置为true20                 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)运行宿主程序[在客户端调用时要先运行宿主程序],如下图所示:

 

 

建立客户端

  (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_Form33 {34     public partial class MainForm : Form35     {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类。

 

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