认识Windows Communication Foundation

            好久没有写博客,作为一个程序员,我居然习惯了不写博客。也难怪这些年来,一直原地踏步,无所长进。真是一份付出一份收获,种瓜得瓜,种豆得豆。

Windows Communication Foundation   是一种非常实用、非常强大的技术。属于.NET范畴内的,微软推出的技术。在这个.NET即将失去市场的日子里,也只有WCF这个技术还有点价值,还可以得到市场的认可。为了提升自己的价值,要好好学习一些实用、值钱的技术。

                                                          

Where Is WCF Come From

            wcf是什么?为什么是一项值钱的技术?在开始说明wcf是什么、wcf的价值之前,让我们先回顾一下早些日子里的个人电脑应用程序是如何工作的,这样有助于理解,为什么会推出wcf这项技术。在最初的日子里,个人电脑应用软件都非常匮乏且不可以多个任务同时进行。例如: word processor(文字处理器) 、spreadsheet(电子表格)、database(数据库)。一般用户,使用数据库存储业务数据,用电子表格分析数据,最后通过文字处理器将这些数据整理做出报表。这些个应用程序之间不能相互通信、交互操作,并且必选安装在相同的一台电脑上。随着网络的不断发展,人们对数据共享的要求越来越急迫。例如,在一个公司内的员工,需要共享数据,那么就需要各个应用软件间互相通信、互相交互,且这些应用软件可以安装在不同的电脑上。

        此时,就出现了Inter-Process communication技术(进程间通信)。例如 named pipe、sockets,这些技术的出现,使得应用程序之间可以相互交互、通信、互相发送信息、协同完成任务。但是,这些技术都是非常底层的网络技术,对开发人员要求极高,大大加强了开发人员的工作量。随着技术的快速发展,微软又相继推出了Component Object Model(COM)、Distributed Component Object Model(DCOM)、COM+、.NET Framework、Remoting 等技术。这些技术,都是为了实现应用程序与组件之间相互通信的。

     既然有这么多技术来支持应用程序与组件之间通信,那为什么还需要推出WCF这项技术呢?它又为什么比其他技术更值钱呢?如果我们日常需求只停留在局域网内,各个软件之间共享数据、发送、接收数据,协同完成任务这个层面,那么以上那些技术已经可以很好的满足我们的需求了,根本不需要使用WCF这项技术。但是,随着World wide web的快速发展,出现了web Service这个概念。web service,是指在服务器上执行的应用程序或组件。也就是说,我们使用的应用程序或者服务,不是本地安装软件,而是通过World wide web来访问部署这些应用软件的服务器,来获取服务。我们在平日的项目开发中,特别是前台开发,我们都会经常使用Ajax技术来实现页面局部刷新,或者通过Ajax调用后台代码,完成对数据库的增删改查。其实,Ajax就算一种web service经常使用的技术 .web service概念与另一个概念联系紧密,Service-Oriented Architecture(SOA 面向服务架构). 功能以接口的形式提供给用户,接口的实现,对用户透明,用户不会看到接口的实现,也不需要关注接口的实现。接口的实现,可以使用已有的软件功能或者其他的web service。面向服务的体系结构,就是分布式服务。

   通过以上对web service 与SOA的理解,大家可以看出,其实分布式服务的实质,就是通过网络与各个应用服务、组件相互接收信息、回复信息、协同合作。这些应用服务、组件可以部署在世界上的任何地方,不在像之前那么,局限在一个公司的局域网中。WCF就是为了创建web service而推出的技术。web service是一种服务,它不依赖于开发语言与部署服务器环境。使用java等其他语言,也可以实现一个web service。

 

The  Benefits Of WCF

           要想实现应用程序与web service的通信,就要考虑以下几点:

     1.传输数据的格式

     2.传输使用的协议

     3.数据安全

     以上这些问题,都是需要双方认同的、需要保持一致的。只有这样,才可以互相通信。web service使用XML 或者JASON作为数据传输的格式。使用Simple Object Access Protocol(SOAP)协议进行相互通信。SOAP协议定义了:

    1.SOAP协议消息的格式

   2.传输数据如何加密

   3.怎样对SOAP消息回复

web service可以发布Web Service Description Language(WSDL)文档,这个文档是由XML形式展示的,描述了Web Service可以接收的消息、以及返回的消息结构。客户端应用程序通过WSDL文档来决定如何与Web Service进行通信。

以上的这些,WCF会提供一个模型,很方便配置以上内容。

Building WCF Service

  接下来,我们来动手开发一个WCF服务。要开发的WCF包含两部分:WCF服务、客户端应用程序。将开发好的WCF服务部署到IIS上,客户端应用程序调用服务。

WFC可以基于多种类型的模板开发,例如网站、类库、工作流等。今天我们使用网站模板来开发WCF服务。

一、  先创建一个空的解决方案,名称为TestService.

二、 双击解决方案->新增->新网站。 弹出的窗口,选择WCFService.如下图:

三、创建WCF Service 后,如下图:

我将网站起名字为PracticeService, 图中被红色圈中的是WCF 服务,TestService是客户应用程序,待会下面会讲到。

在App_Code文件下,会出现两个类:IService.cs 、Service.cs。我将对应的两个类改为了:IPracticeService.cs  Practice.cs。

 

Definition Contract

 WCF包含,Service Contract(服务契约)、Data Contract(数据契约)、Operation Contract(操作契约)、Member Contract(数据成员契约)。
Service Contract:向外界提供的服务。只有标注为Service Contract 的接口,才能被外界以服务的形式看到。
Operation Contract:接口内的方法,只用被Operation Contract属性定义后,才可以被外界调用。
Data Contract:只有被Data Contract 属性定义后的类,才可被WCF序列化、反序列成符合XML Schema(XML架构)的数据流。从客户端至WCF服务,数据类型一定要符合XML Schema.客户端发送数据至WCF,先将数据类型系列化成XML流,到达WCF服务端后,WCF将XML数据流,反序列化成.NET对象,反之亦然。由此可见,只要是需要传输的类,必须要具有Data Contract.(Data Contract 属性可以定义在类、结构、枚举上)。
Data Member:被传输的类中字段,需要被Data Member属性标记,才可以被访问。
以下是IPracticeService.cs代码段:
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel; namespace Test { [ServiceContract] public interface IPracticeService { [OperationContract] List<string> GetAllGirl(); [OperationContract] Girl GetSpecificGirl(string Id);  // TODO: Add your service operations here  } // Use a data contract as illustrated in the sample below to add composite types to service operations.  [DataContract] public class Girl { [DataMember] public string Id { get; set; } [DataMember] public string Name { get; set; } [DataMember] public string Age { get; set; } [DataMember] public string Marry { get; set; } } }
这是一个被Service Contract属性标记的接口,也是WCF服务提供的服务。接口内的方法,被Operation Contract属性标记过,才可以被访问。定义了一个Girl类,使用Data Contract标记,其中字段使用DataMember属性标记。这个接口提供了一下几个功能:
1.获取所有女孩子信息
2.获取具体某个女孩子信息
 
令Practice.cs类实现IPractice接口,下面是Practice实现类代码段:
using System.Collections.Generic;
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service" in code, svc and config file together.
namespace Test { public class Practice : IPracticeService { public List<string> GetAllGirl() { List<string> collect = new List<string>(); string name = "MARY"; collect.Add(name); name = "CHRISTINE"; collect.Add(name); name = "TINA"; collect.Add(name); name = "CRYSTAL"; collect.Add(name); name = "SUZANNE"; collect.Add(name); name = "BEATRICE"; collect.Add(name); name = "KATIE"; collect.Add(name); return collect; } public Girl GetSpecificGirl(string Id) { Girl girl = new Girl { Age = "22", Name ="SUZANNE", Marry = "Single"}; return girl; } } }

我们只是为了,实现WCF服务与客户端通信,所以简单起见,不再写复杂的数据访问层代码,不访问数据库,直接hard-code代码,来实现接口。

值得注意的是,.svc文件(Service.svc)。这个文件指明了,实现了WCF服务类的名称与位置。特别是在将WCF服务部署到IIS时,IIS需要.svc文件。如下图:

 

右击Service.svc,选择在浏览器中查看。看到如下图信息时,说明成功创建了WCF服务。

点击上图中两个链接的任意一个,弹出如下图页面:

这个页面,显示的是WSDL(Web Service Definition Language)文档,是由WCF 服务生成的元数据文件,描述了WCF服务的相关信息。客户端,就是通过WSDL文档,去与WCF服务通讯。可以把WSDL文档,看作是商品使用说明书。(WCF 服务,看作是商品)

以上就是我们的PracticeService 服务,它提供了两个方法,1.获取所有女孩子信息 2.获取具体某个女孩子信息。服务开发完了,但是还不能被访问。因为需要部署到Internet ,才可以被全世界访问到。接下来,就要部署WCF服务。

 

Deploying WCF Service Into IIS

WCF可以被部署到多种环境中,例如:IIS、 Windows服务、独立的应用程序等。在这里,以IIS为例。

双击PracticeService网站,点击发布web应用程序,如下图:

选择自定义,在弹出页面,输入PracticeService作为文件名。

按照下图序号依次操作。

部署后,打开IIS,应能看到如下图所示,WCF 服务部署成功。

接下来,就是测试WCF服务了。

 

Building A WCF Client Application

创建一个控制台程序,TestService.双击服务引用,选择添加服务引用。如下图:

点击发现,会看到我们刚才部署的WCF服务。在下面的命名空间,填写PracticeService.

测试WCF服务,调用WFC服务。

using System;
using TestService.PracticeService;
namespace TestService { class Program { static void Main(string[] args) { Console.WriteLine("Press ENTER when the service has started"); Console.ReadLine(); PracticeServiceClient proxy = new PracticeServiceClient(); Console.WriteLine("Test 1: List all Gril's name"); string[] grils=proxy.GetAllGirl(); foreach (string girlsName in grils) { Console.WriteLine("Number: {0}", girlsName); } Console.WriteLine(); Console.WriteLine("Test 2: Display the details of a girl"); Girl girl = proxy.GetSpecificGirl("CHRISTINE"); Console.WriteLine("Number: {0}", girl.Name); Console.WriteLine("Age: {0}", girl.Age); Console.WriteLine("marry: {0}", girl.Marry); Console.WriteLine(); } } }

引用服务引用命名空间,using TestService.PracticeService; 该命名空间包含PracticeServiceClient类(proxy),代理类。代理类相当于客户端到WCF Service之间的翻译官。代理类使客户端对WCF服务的访问,变成类似于对象实例访问方法的形式。代理类将客户端对函数的调用转换成对WCF 服务的访问。wcf服务返回的消息,被代理类转换成对函数的调用。

代理类是如何做到这些的呢?当 WCF服务发布后,会生成WSDL文档,WSDL文档描述了WCF服务的metadata(元数据)。代理类就是通过WSDL来完成翻译工作的!

请注意APP.config文件,如下图:

上图中Client标签内的信息,说明了客户端是如何与WCF Service通信的。在Client的标签内的endpoint(终结点)标签,说明了WCF service的详细信息。其中包括:

address(地址):web service服务部署的地址,以便客户端去访问。

binding(绑定):主要包含web service通信相关的信息,例如传输机制、传输协议等。binding支持多种传输协议,默认使用BasicHttpBinding,使用http协议通信。

contract(契约):说明web service提供的服务。

 

WCF AND The Principles of  SOA

到此,我们已经使用WCF开发了一个webservice服务,只要知道部署webservice服务的地址,世界上任何一台计算机,都可以使用它。我们前面讲到了,SOA(Service-Oriented  Architecture 面向服务的架构)。SOA的原理,就是将软件功能以服务的形式放在internet上,客户不需要知道实现服务的细节,只要明白这个服务是做什么的,知道服务所在地址,就可以。就像我们知道一张图片的地址,我们就可以去访问它。每个服务都是一个小web service,客户端使用服务,访问web service.因为与web service的访问与网络协议,传输协议等有关,与客户端程序用何种语言开发无关。所以,web service可以被不同语言开发的客户端程序通信。

WCF是一个实现SOA程序的平台,使用WCF可以快速开发SOA程序。

 

转载于:https://www.cnblogs.com/VitoCorleone/p/9240654.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode--714. 买卖股票的最佳时间含手续费

给定一个整数数组 prices&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 &#xff1b;非负整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&#xff0c;但是你每次交易都需要付手续费。如果你已经购买了一个股票&#xff0c;在卖出它之前你就不能再继续购买…

图解丨卷积神经网络数学原理解析

原标题&#xff1a;Gentle Dive into Math Behind Convolutional Neural Networks作 者&#xff1a;Piotr Skalski 编 辑 | Pita  翻 译&#xff1a;通夜&#xff08;中山大学&#xff09;、had_in&#xff08;电子科技大学&#xff09;自动驾驶、智能医疗保健和自助零售这…

java接收uniapp上传的图片_uni-app 上传图片的坑

起先&#xff0c;在uni-app插件市场下载了上传图片的插件由于uni-app的API uni.unloadFile()其中content-type 为 multipart/form-data导致在于后端对接口时出现跨域最后解决方法:自己重新用axios封装了一个请求方式npm install axiosutil / axios-request.jsimport axios from…

Leetcode--123. 买卖股票的最佳时间Ⅲ

给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意: 你不能同时参与多笔交易&#xff08;你必须在再次购买前出售掉之前的股票&#xff09;。 示例 1: 输入: [3,3,5,0,…

[2018湖南省队集训] 6.28 T3 simulate

这道模拟题出的我毫无脾气2333 最重要的是先要发现操作顺序不影响最后的答案&#xff0c;也就是每次随便挑一个>2的数进行操作最后总是可以得到同样的数列。 (这个还不太难想qwq) 但是最骚的是接下来的模拟。。。。 我们考虑从左到右消&#xff0c;假设目前在i&#xff0c;1…

“AI工厂”本质:AI基础设施及怎样将AI转化为运营动力

来源&#xff1a;TechTalks作者&#xff1a;Ben Dickson编译&#xff1a;科技行者持续关注人工智能新闻的朋友肯定已经发现&#xff0c;AI这个字眼已经被异化成了两个截然不同的定义。媒体和影视作品喜欢把AI描述成已然具备人类般的能力、会导致大量失业甚至会出动机械部队进行…

Leetcode--188. 买卖股票的最佳时机Ⅳ

给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。 注意: 你不能同时参与多笔交易&#xff08;你必须在再次购买前出售掉之前的股票&#xff09;。 示例 1: 输入: [2,4,1], k…

java comparator内部类_java - Java Comparator使用.reverseOrder()但内部类 - 堆栈内存溢出...

我正在创建一个简单的程序来了解Java Comparator类。 我已经按顺序对一个Arraylist了排序&#xff0c;但现在我想按降序对列表进行排序&#xff0c;但是我在调​​用.reverseOrder()方法时遇到问题&#xff0c;因为我使用了一个实现Comparator的内部类(歌曲是一首歌)容纳吸气剂…

继续深入更新shell脚本容易出错的地方

一、在shell中用到如果需要输入某些值&#xff0c;需要用到read -p命令 这是我写的猜数字游戏&#xff0c;一开始在输出的时候&#xff0c;屏幕上总会打印输出 "INT" 经过反复的练习才发现 双引号后面应该跟着一个空格&#xff0c;然后在写变量&#xff0c;就不会把…

中国工程院发布2021中国电子信息工程科技发展十四大趋势

来源&#xff1a;人民邮电报1月5日&#xff0c;中国工程院信息与电子工程科技发展战略研究中心发布“中国电子信息工程科技发展十四大趋势&#xff08;2021&#xff09;”。这十四大趋势涵盖信息化、计算机系统与软件、网络与通信、计算机应用、网络安全、集成电路、数据、感知…

AcWing--2.01背包问题

有 NN 件物品和一个容量是 VV 的背包。每件物品只能使用一次。 第 ii 件物品的体积是 vivi&#xff0c;价值是 wiwi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&#xff…

java实现数组排序代码_Java使用选择排序法对数组排序实现代码

编写程序&#xff0c;实现将输入的字符串转换为一维数组&#xff0c;并使用选择排序法对数组进行排序。思路如下&#xff1a;点击"生成随机数"按钮&#xff0c;创建Random随机数对象&#xff1b;使用JTextArea的setText()方法清空文本域&#xff1b;创建一个整型一维…

Python题整理

1、Python的多态、鸭子类型&#xff1f; 2、Python的序列化工具有哪些&#xff1f; 3、Python处理Excel的工具有哪些&#xff1f; 4、Python处理Graph的算法库有哪些&#xff1f; 5、Python的dict是基于什么数据结构实现的&#xff1f;优点和缺点是什么&#xff1f; 6、 对于di…

ICinsights:中国芯片难达成既定的2025目标

来源&#xff1a;内容由半导体行业观察&#xff08;ID&#xff1a;icbank&#xff09;综合自「ICinsights」&#xff0c;谢谢。据知名分析机构ICinsights报道&#xff0c;在中国的集成电路市场和中国的本土集成电路生产之间应该有一个非常明显的区别。正如IC Insights经常指出的…

AcWing:3.完全背包问题

有 NN 种物品和一个容量是 VV 的背包&#xff0c;每种物品都有无限件可用。 第 ii 种物品的体积是 vivi&#xff0c;价值是 wiwi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整…

html与js与mysql_WebView加载html与JS交互

一、加载Html的几种方法直接在Activity中实例化WebViewWebView webview new WebView(this);webview.loadUrl(......);在XML中生命webviewWebView webView (WebView) findViewById(R.id.webview);载入工程内部页面 page.html存储在工程文件的assets根目录下webView (WebView) …

2021年5G发展展望

来源&#xff1a;中国电子信息产业发展研究院&#xff08;转载请注明来源&#xff09;编辑&#xff1a; 蒲蒲日前&#xff0c;在2020通信产业大会暨第十五届通信技术年会上&#xff0c;工信部赛迪智库发布了《5G发展2021展望白皮书》。白皮书内容包括对2021年5G形势的基本判断、…

博弈论笔记--03--迭代剔除和中位选民定理

迭代剔除策略:先站在所有人的角度&#xff0c;删除所有的劣势策略&#xff0c;然后重复这个过程。Game One--中间选民定理的例子博弈者&#xff1a;2个Players需要选择自己的政治立场。策略选项&#xff1a;一共有1-10种政治立场&#xff0c;每种都有10%的选民支持。收益:候选者…

Leetcode--136. 只出现一次的数字

给定一个按照升序排列的整数数组 nums&#xff0c;和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值&#xff0c;返回 [-1, -1]。 示例 1: 输入: nums [5,7,7,8,8,10], target 8 输…

喜忧参半:我国蜂窝物联网全球占比超过75%

来源: C114通信网随着连接技术的不断创新&#xff0c;我们将迎来真正万物互联的智能世界。而在物联网产业链条中&#xff0c;通信运营商一直扮演着至关重要的角色。知名物联网市场研究机构IoT Analytics的数据显示&#xff1a;蜂窝物联网连接数方面&#xff0c;中国电信、中国联…