博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WCF学习笔记(1)——Hello WCF
阅读量:5257 次
发布时间:2019-06-14

本文共 5093 字,大约阅读时间需要 16 分钟。

1.什么是WCF

  Windows Communication Foundation(WCF)是一个面向服务()的通讯框架,作为.NET Framework 3.0的重要组成部分于2006年正式发布。WCF的使命是对Windows平台下现有的通讯技术(包括:、、、、、)进行全面整合,并设计了一个统一的程序开发模型(API),对于数据通信提供了最基本最有弹性的支持。

 

2.WCF的体系结构

  我们从下面WCF的体系结构图可以看出WCF是Windows平台下通讯技术的集大成者:

  

 

3.WCF的寄宿

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

 

4.WCF的HelloWorld

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

4.1,创建HelloWcfService解决方案。 (切记已管理员身份运行VS,否则会报错的)

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

  

 

4.2,定义服务的契约(接口)

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

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

1 using System.ServiceModel; 2  3 namespace ContractService 4 { 5     [ServiceContract(Name = "CalculatorService", Namespace = "http://www.cnblogs.com/IPrograming")] 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 }

 

4.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         /// 加法11         public double Add(double num1, double num2)12         {13             return num1 + num2;14         }15 16         /// 减法17         public double Subtract(double num1, double num2)18         {19             return num1 - num2;20         }21 22         /// 乘法23         public double Multiply(double num1, double num2)24         {25             return num1 * num2;26         }27 28         /// 除法29         public double Divide(double num1, double num2)30         {31             return num1 / num2;32         }33 34         #endregion35     }36 }

 

4.4,承载(寄宿)和运行服务

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

  在编写借宿WCF服务的代码前我们需要先了解几个概念:

终结点:

WCF服务的所有通信是通过该服务的终结点进行的。 利用终结点,客户端可访问 WCF 服务提供的功能。终结点由三部分组成:

  • 地址:地址唯一地标识终结点,并告诉服务的潜在客户其所在的位置。
  • 绑定:指定如何与终结点进行通信(包括使用的通信协议和消息编码等)。
  • 契约:契约抽象了服务的操作,公开了终结点向客户端开放的功能。

 

元数据:

WCF 服务使用元数据来描述如何与服务终结点进行交互,以便工具(例如:Svcutil.exe)生成用于访问服务的客户端代码。

 

   在解决方案的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会自动生成一系统服务调用的代码和配置(这里暂时不做讨论)。

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

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         }

 运行结果如下:

 

猛击下载:

参考资料&进一步阅读

转载于:https://www.cnblogs.com/dwuge/p/5318200.html

你可能感兴趣的文章
webpack项目在开发环境中使用静态css文件
查看>>
C语言文件操作函数大全
查看>>
服务器swap
查看>>
杀MYSQL SLEEP进程
查看>>
多个有序链表的合并
查看>>
C++对C语言的拓展(5)—— 函数重载和函数指针结合
查看>>
hdu 2031 杨辉三角
查看>>
详解两种C#自动实现DLL(OCX)控件注册的方法
查看>>
浅谈echo、print、var_dump()、print_r()的区别
查看>>
jQuery 知识积累
查看>>
Sublime Text 3中文乱码问题的解决(最有效)
查看>>
如何将json格式的string字符串转换为string数组
查看>>
c++三/五法则
查看>>
强人工智能之“全本的鹦鹉”
查看>>
spring事物配置,声明式事务管理和基于@Transactional注解的使用(转)
查看>>
【BZOJ3215/3216】[ZJOI2013]话旧/话旧2(组合数学,动态规划)
查看>>
原生JS例子
查看>>
PHP+MYSQL实现分页
查看>>
python网络爬虫抓取动态网页并将数据存入数据库MySQL
查看>>
PHP 表单和用户输入
查看>>