WCF架构入门-用VS2008构建WCF

    根据微软官方的解释,WCF(之前的版本名为“Indigo”)是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。WCF是微软分布式应用程序开发的集大成者,它整合了.Net平台下所有的和分布式系统有关的技术,例如.Net Remoting、ASMX、WSE和MSMQ。以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于 Internet;以宿主程序而论,可以以ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host)。WCF可以支持的协议包括TCP,HTTP,跨进程以及自定义,安全模式则包括SAML, Kerberos,X509,用户/密码,自定义等多种标准与模式。也就是说,在WCF框架下,开发基于SOA的分布式系统变得容易了,微软将所有与此相关的技术要素都包含在内,掌握了WCF,就相当于掌握了叩开SOA大门的钥匙。

   本文就是要通过一个简单的例子,介绍WCF架构的搭建方法和步骤。本文使用的开发工具是VS2008。

  WCF架构包括三大部分:服务、宿主进程和客户端。其中服务和宿主进程属于服务端。

一、服务(Service)

  服务主要包括契约和服务的实现。

1.1 契约

  WCF的所有服务必须公开契约。契约是与平台无关的,描述服务功能的标准方式。主要有服务契约、数据契约、消息契约和错误契约。

  本文着重介绍一下服务契约的定义。我们所提供的服务是一个加法计算(Add)。首先我们定义契约。

view plain copy to clipboard print ?
  1. using System;  
  2.   
  3. using System.Collections.Generic;  
  4.   
  5. using System.Linq;  
  6.   
  7. using System.Text;  
  8.   
  9. using System.ServiceModel;  
  10.   
  11. namespace manual_WCF  
  12.   
  13. {  
  14.   
  15.     [<font color="#339900">ServiceContract</font>]  
  16.   
  17.     interface IMyProcess  
  18.   
  19.     {  
  20.   
  21.         [<font color="#339900">OperationContract</font>]  
  22.   
  23.         int Add(int a, int b);  
  24.   
  25.     }  
  26.   
  27. }  

  我们可以将[ServiceContract]属性应用到接口或者类上,但是通常我们将其应用于接口上,而不是类上。

  另外,即使接口应用了[ServiceContract]属性,并不意味它的所有成员都是契约的一部分。我们必须使用[OperationContract]属性显式地标注哪些方法需要暴露为WCF契约的一部分。

1.2 服务的实现

  服务实现,其实就是对契约(接口)的实现。

view plain copy to clipboard print ?
  1. <font color="#000000"><pre class="csharp" name="code"><strong>using System;  
  2.   
  3. using System.Collections.Generic;  
  4.   
  5. using System.Linq;  
  6.   
  7. using System.Text;  
  8.   
  9.   
  10.   
  11. namespace manual_WCF  
  12.   
  13. {  
  14.   
  15.     class MyProcess:IMyProcess  
  16.   
  17.     {  
  18.   
  19.         public int Add(int a, int b)  
  20.   
  21.         {  
  22.   
  23.             Console.WriteLine("Received Add({0},{1}) Returnning:{2}",a,b,a+b);  
  24.   
  25.             return a + b;  
  26.   
  27.         }  
  28.   
  29.     }  
  30.   
  31. }</strong></pre>  
  32. </font>  

二、宿主进程(Host)

  WCF服务不可能凭空存在。每个WCF服务必须托管(Hosting)在Windows进程中,该进程就称为宿主进程(Host Process)。宿主可以由IIS提供,也可以有WindowsForm程序或者Console提供,也可以由Windows服务提供。

view plain copy to clipboard print ?
  1. <font color="#000000"><strong>using System;  
  2.   
  3. using System.ServiceModel;  
  4.   
  5. using System.ServiceModel.Description;  
  6.   
  7. using System.Net;  
  8.   
  9.   
  10.   
  11. namespace manual_WCF  
  12.   
  13. {  
  14.   
  15.     class Program  
  16.   
  17.     {  
  18.   
  19.         static void Main(string[] args)  
  20.   
  21.         {  
  22.   
  23.             Uri baseAddress = new Uri("http://localhost:8001/");  
  24.   
  25.   
  26.   
  27.             ServiceHost Host = new ServiceHost(typeof(MyProcess), baseAddress);  
  28.   
  29.     
  30.   
  31.             Host.AddServiceEndpoint(typeof(IMyProcess),new BasicHttpBinding(),"manualWCF");  
  32.   
  33.   
  34.   
  35.             ServiceMetadataBehavior smb = new ServiceMetadataBehavior();  
  36.   
  37.             smb.HttpGetEnabled = true;  
  38.   
  39.             Host.Description.Behaviors.Add(smb);  
  40.   
  41.   
  42.   
  43.             Host.Open();  
  44.   
  45.             
  46.   
  47.   
  48.   
  49.             Console.WriteLine("The manual WCF is running at " + baseAddress.ToString()+"manualWCF");  
  50.   
  51.   
  52.   
  53.             Console.WriteLine("Press <ENTER> to terminate");  
  54.   
  55.             Console.ReadLine();  
  56.   
  57.   
  58.   
  59.             Host.Close();  
  60.   
  61.            
  62.   
  63.         }  
  64.   
  65.     }  
  66.   
  67. }</strong></font>  
view plain copy to clipboard print ?
  1. <font color="#000000"> </font><font color="#3366ff"><strong>三、客户端(Client)</strong></font>  

  若要调用WCF服务的操作,客户端需要首先导入服务契约到客户端本地描述(Native Representation)中。如果客户端使用WCF,调用操作的常见做法是使用代理。代理是一个CLR类,它公开了一个单独的CLR接口用以表示服务的契约。代理完全封装了服务的每一个方面:服务的位置、实现技术、运行时平台以及通信传输。

3.1 生成代理

  使用命令行工具SvcUtil.exe 生成代理

svcutil.exe /language:c# http://localhost:8001

  运行以上命令会生成两个文件MyProcess.cs和output.config。将这两个文件导入到客户端工程中(将output.config改名为app.config)。

3.2 调用服务操作

  此时,就可以像使用本地方法一样使用WCF服务中的操作了

view plain copy to clipboard print ?
  1. <font color="#000000">using System;  
  2.   
  3. using System.Collections.Generic;  
  4.   
  5. using System.Linq;  
  6.   
  7. using System.Text;  
  8.   
  9.   
  10.   
  11. namespace Client_manual  
  12.   
  13. {  
  14.   
  15.     class Program  
  16.   
  17.     {  
  18.   
  19.         static void Main(string[] args)  
  20.   
  21.         {  
  22.   
  23.             MyProcessClient client = new MyProcessClient();  
  24.   
  25.             Console.WriteLine(client.Add(3,5));  
  26.   
  27.             Console.ReadLine();  
  28.   
  29.         }  
  30.   
  31.     }  
  32.   
  33. }</font>  

WCF架构入门-用VS2008构建WCF_第1张图片

你可能感兴趣的:(WCF架构入门-用VS2008构建WCF)