`

WCF简介及实例

    博客分类:
  • c#
阅读更多

      Windows Communication Foundation(WCF)是一个面向服务(SOA)的通讯框架,作为.NET Framework 3.0的重要组成部分于2006年正式发布。WCF的使命是对Windows平台下现有的通讯技术(包括:COMDCOM.NET RemotingWeb ServicesMSMQWinSocket)进行全面整合,并设计了一个统一的程序开发模型(API),对于数据通信提供了最基本最有弹性的支持。借助这一模型,开发人员可以构建既能跨平台与现有投资集成又能与现有投资交互的安全、可靠的事务处理解决方案。

 

下面的示例阐释了 WCF 处理的一些问题。一家汽车租赁公司决定创建一个新的应用程序,用于汽车预定。该租车预定应用程序的创建者知道,应用程序所实现的业务逻辑必须能够让公司内外运行的其他软件访问。因此,他们决定以面向服务的方式来创建此应用程序,并通过定义完善的一组服务,将此应用程序的逻辑公开给其他软件。为了实现这些服务并使之与其他软件进行通信,这一新应用程序将使用 WCF。

 

租车方案

 

在租车预定应用程序的生存期内,可能会有一系列其他应用程序访问此应用程序。但是在设计期间设计者知道,将有其他三种软件访问该租车预定应用程序的业务逻辑(如上图所示):

  • 运行在 Windows 桌面上的呼叫中心客户端应用程序,它由该组织的呼叫中心员工使用。此应用程序是专门针对新的预定系统创建的,也可以使用 Microsoft .NET Framework 和 WCF 来构建。此应用程序与新的租车预定应用程序并不泾渭分明,因为它的唯一用途是作为该新系统的客户端。从面向服务的角度来看,它只是该预定系统的业务逻辑的另一个客户端。
  • 基于 J2EE 服务器构建、在非 Windows 系统上运行的现有预定应用程序。由于最近与另一家汽车租赁公司合并,此现有系统必须能够访问新应用程序的逻辑,以便为合并后公司的客户提供一致的体验。
  • 运行在各种平台上的合作伙伴应用程序,每个应用程序分别位于一个与该汽车租赁公司有业务合作的公司内。合作伙伴可能包括旅行社、航空公司,以及具有租车预定业务需求的其他组织。

下面是wcf体系结构图:

 

WCF寄宿:

 

首先WCF应用程序是不能独立存在的,它必须依附于(寄宿)于其他的应用程序(宿主)中,宿主进程是专为承载服务而设计的应用程序。这些宿主进程包括 Internet 信息服务 (IIS)、Windows 激活服务 (WAS) 和 Windows 服务、开发人员创建的应用程序。

 

 

下面我们通过一个简单的示例程序来学习如何构建一个WCF程序,以便于对WCF编程建立一个初步的印象。我们创建一个计算器服务,实现简单的加、减、乘、除的操作,然后由另一个进程(本地或远程)来调用这个服务。

 

1.首先我们创建一个名为:HelloWcfService解决方案,在该解决方案下创建一个Hosting的控制台项目;用于承载WCF服务。接着创建一个ContractService类库项目,定于定于服务的契约(接口);再最后创建一个Service类库项目,用于实现ContractService定义的服务契约(接口)。如下:

  

 

2.从字面上来理解,服务契约就是:服务所提供操作的一个抽象。服务契约指定了服务支持的操作,通过使用接口来创建契约,接口中的每个方法都应对与特定的服务操作,同时定义契约的接口必须应用ServiceContractAttribute特性,同时我们需要在接口中定义的方法应用OperationContractAttribute特性,否则不公开该方法。

  我们在创建的解决方案中的ContractService类库项目中引用System.ServiceModel程序集,并添加System.ServiceModel命名空间,接着创建一个用于定义服务契约的接口,代码如下:

 
 1 using System.ServiceModel;
 2 
 3 namespace ContractService
 4 {
 5     [ServiceContract(Name = "CalculatorService", Namespace = "ContractService")]
 6     public interface ICalculator
 7     {
 8         [OperationContract]
 9         double Add(double num1, double num2);//加法
10         [OperationContract]
11         double Subtract(double num1, double num2);//减法
12         [OperationContract]
13         double Multiply(double num1, double num2);//乘法
14         [OperationContract]
15         double Divide(double num1, double num2);//除法
16     }
17 }

 

3.在前面我们只是对服务具有哪些操作进行一个抽象的定义,我们需要这个抽象的契约进行实现。在我们的这个例子中就是实现ICalculator接口。首先我们在Service的类库项目添加对ContractService类库项目的引用,并添加ContractService命名空间,然后实现ICalcultor接口,代码如下:

 1 using System;
 2 using ContractService;
 3 
 4 namespace Service
 5 {
 6     public class CalculatorService : ICalculator
 7     {
 8         #region ICalculator 成员
 9 
10         /// <summary>加法</summary>
11         public double Add(double num1, double num2)
12         {
13             return num1 + num2;
14         }
15 
16         /// <summary>减法</summary>
17         public double Subtract(double num1, double num2)
18         {
19             return num1 - num2;
20         }
21 
22         /// <summary>乘法</summary>
23         public double Multiply(double num1, double num2)
24         {
25             return num1 * num2;
26         }
27 
28         /// <summary>除法</summary>
29         public double Divide(double num1, double num2)
30         {
31             return num1 / num2;
32         }
33 
34         #endregion
35     }
36 }

 

4.通过前面我们知道WCF服务是无法独立存在在,它必须是寄宿于其他的宿主(应用程序)中,寄宿服务的对象可以是开发人员自己创建的应用程序可以使用IIS和Windows服务等作为服务的宿主。在这里我们通过创建的控制台程序来作为服务的宿主。

 

5.在解决方案的Hosting项目中添加对System.ServiceModel程序集Service项目以及ContractService类库项目的引用,并添加相应的命名空间。代码如下

 1   static void Main(string[] args)
 2         {
 3             //定义承载服务的类型和承载服务的基址
 4             using (ServiceHost host = new ServiceHost(typeof(CalculatorService), new Uri("http://localhost:8889/CalculatorService")))
 5             {
 6                 //增加一个服务终结点
 7                 host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
 8 
 9                 //使用元数据
10                 ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
11                 //使用HTTP/GET请求
12                 behavior.HttpGetEnabled = true;
13                 //定义元数据发布地址
14                 behavior.HttpGetUrl = new Uri("http://localhost:8889/CalculatorService/Metadata");
15                 //将元数据的定义添加到承载服务中
16                 host.Description.Behaviors.Add(behavior);
17 
18                 // 启动服务
19                 host.Open();
20                 Console.WriteLine("CalculatorService服务运行中...\n");
21                 Console.WriteLine("按任意键退出.");
22                 Console.Read();
23                 // 关闭服务
24                 host.Close();
25             }
26         }

运行宿主程序后,我们在浏览器中输入下面的地址进行查看服务是否成功运行:

  • 服务的地址:http://localhost:8889/CalculatorService 
  • 元数据的地址:http://localhost:8889/CalculatorService/Metadata

 

5.调用WCF服务:

前面我们已经成功的创建一个可以用于基础运算的WCF服务,我们创建一个HelloWcfClient控制台应用程序用来调用前面WCF提供的服务,我们通过这个服务发布的元数据来生成调用代码(使用Svcutil.exe工具)Visual Studio可以为我们简化这一过程:运行WCF服务的宿主程序后,为HelloWcfClient项目添加服务引用,服务的地址就是前面创建的元数据地址:http://localhost:8889/CalculatorService/Metadata ,Visual Studio会自动生成一系统服务调用的代码和配置:

WCF5.jpg

 

只需要几行代码就可以完成服务的调用,调用代码如下:

 1         static void Main(string[] args)
 2         {
 3             using (CalculatorServiceClient proxy = new CalculatorServiceClient())
 4             {
 5                 Console.WriteLine("{0}+{1}={2}", 1, 2, proxy.Add(1, 2));
 6                 Console.WriteLine("{0}-{1}={2}", 5, 2, proxy.Subtract(5, 2));
 7                 Console.WriteLine("{0}*{1}={2}", 1, 2, proxy.Multiply(1, 2));
 8                 Console.WriteLine("{0}/{1}={2}", 1, 2, proxy.Divide(1, 2));
 9             }
10             Console.Read();
11         }

 运行结果如下:

1
0
分享到:
评论

相关推荐

    WCF应用开发实例

    本实例“WCF应用开发实例”涵盖了如何创建和测试WCF服务的基本流程。 首先,我们关注的是"WcfService"项目,这是一个WCF服务应用。它提供了两个对外的接口,这些接口定义了服务公开的功能。在WCF中,服务接口通常...

    WCF 22个实例1

    WCF 22个实例1 wcf 收藏,好东西

    WCF 22个实例2

    WCF 22个实例2 wcf 值得收藏,好资源

    WCF传输使用实例 WCF传输使用实例

    通过这种方式,我们可以实现一个简单的WCF通信实例,其中服务器端提供服务,客户端消费服务。WCF的强大之处在于其灵活性,可以根据需求调整各种配置,实现更复杂的服务交互,包括异步调用、双向通信、安全性和事务...

    WCF TCP 源码下载实例

    ### WCF简介 WCF是一种全面的服务模型,它集成了.NET Framework中的多种通信技术,如ASMX、.NET Remoting、WS*等,为开发人员提供了统一的API来创建跨平台、跨语言的服务。WCF服务可以支持多种传输协议,包括HTTP、...

    WCF服务简单实例WCF服务简单实例

    **WCF服务简单实例** Windows Communication Foundation(WCF)是微软.NET Framework中的一种技术,用于构建可互操作的、安全的、可靠的服务。WCF整合了.NET Framework中的多种通信技术,如ASMX、Remoting、Web ...

    wcf经典实例wcf经典实例wcf经典实例

    wcf经典实例wcf经典实例wcf经典实例wcf经典实例wcf经典实例wcf经典实例wcf经典实例wcf经典实例wcf经典实例wcf经典实例wcf经典实例wcf经典实例wcf经典实例wcf经典实例wcf经典实例

    WCF三层实例及宿主

    在这个“WCF三层实例及宿主”的项目中,我们将探讨如何构建一个基于WCF的三层架构应用,并了解其宿主的概念。 **三层架构**是软件开发中的常见模式,包括表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种...

    我的第一个完整的WCF实例

    【标题】"我的第一个完整的WCF实例"是一个展示如何在Visual Studio 2010环境下创建和运行一个功能完备的Windows Communication Foundation (WCF)服务的教程。这个实例不同于网络上常见的简略示例,它提供了更为详尽...

    简单WCF实例WCF初体验

    **二、WCF实例步骤** 1. **创建服务**:首先,我们需要定义一个服务合同,指定服务将提供哪些操作。例如,我们可以定义一个简单的“HelloWorld”服务,包含一个返回问候语的方法。 2. **实现服务**:接着,根据...

    微软新技术WCF介绍及实例演示

    **WCF实例演示** 在实践中,开发者可以通过自我托管或IIS来部署和运行WCF服务。然而,WCF在旧版操作系统上的硬件和软件兼容性存在问题,例如,WAS只在Vista和Server 2008及以上版本中可用,IIS 6.0不支持除HTTP之外...

    WCF高级编程实例C#源代码,有很好的参考价值

    WCF高级编程涉及到许多关键概念和技术,这些都将在提供的C#源代码实例中得到体现。以下是这些知识点的详细说明: 1. **服务合同**:在WCF中,服务合同定义了服务提供的操作或功能。它由接口(在C#中通常是`...

    WCF 22个实例3 wcf

    WCF 22个实例1 wcf 好资源,值得收藏

    WCF实例及文档

    在这个名为“WCF实例及文档”的压缩包中,我们可以找到一个基于WCF技术的基础示例。虽然`Client`项目并未完全完成,但它为我们提供了一个理解WCF基本工作原理的机会。以下是一些关于WCF的关键知识点: 1. **服务...

    WCF小实例[包括WCF事务编程]

    在本实例中,我们将重点探讨WCF服务的基础知识以及如何实现WCF事务编程。** ### 1. WCF基础知识 - **服务导向架构**: WCF基于服务导向架构(SOA),允许服务和客户端之间通过标准协议进行通信。 - **绑定**: 绑定定义...

    WCF vs2010实例

    在“WCF vs2010实例”中,我们将深入探讨WCF的基础概念、工作原理以及如何在Visual Studio 2010中创建和运行WCF服务。 **WCF基础** WCF是微软提供的一个全面的服务架构,用于构建可互操作的、安全的、可靠的服务。...

    WCF实例(入门简单,经典)

    这个“WCF实例(入门简单,经典)”是一个针对初学者的教程,通过一个实际的订票应用程序来介绍WCF的基础概念和使用方法。 **一、WCF基础** 1. **服务导向架构**:WCF基于服务导向架构(SOA),允许不同的应用程序...

    WCF全面解析实例源代码

    **WCF实例源代码分析** 在“WCF全面解析”实例源代码中,你可以找到以下关键部分: 1. **服务实现**: 包含定义服务契约和服务实现的类。服务契约通常在接口中定义,而接口的实现则包含实际业务逻辑。 2. **数据...

    WCF简单实例

    在"**WCF简单实例**"中,我们可以预期学习到如何使用WCF来搭建一个基础的服务,并与客户端进行交互。这通常涉及以下几个关键步骤: 1. **定义服务契约**:服务契约定义了服务提供的操作。在C#中,我们通常使用`...

Global site tag (gtag.js) - Google Analytics