WCF(一) Windows Communication Foundation 概述
我希望能用连续的几篇博文,记录下自己学习WCF的过程,同时也为了能和大家一起交流分享自己学习WCF的心得。
学习WCF的英文资料对英文基础不太好的人来说有些难以接受了,中文书籍不太多,好不容易有两本,又写的像研究生毕业论文一样。
所以,我想写点自己的WCF文章,希望能对自己的WCF知识起到促进作用,又能和大家一起交流,帮助到大家理解WCF。
宗旨:我不会用中文的专业术语(例如:协定,地址,绑定,通道,终结点,宿主,单工、双工,回调等),因为用一个英文单词可以被多个人翻译成多个中文词语,这样不好。我坚持使用英文的原本单词(如:contract,Address,binding,pipe,endpoint,host,one-way ,duplicate,call back)。
本人最为“痛恨”那种满口专业术语讲技术概念的人。如果学习所有的技术都要先被大量技术名词搞晕掉,那学习实在是太痛苦了。我见识过这样的一本书:当你随意翻开一页,随意找出一段读一读,会发现根本不知道作者在讲什么,因为全是难懂的技术名词和概念。遇到这种情况,英文再差的人宁可去读英文资料。我崇尚的技术教学或交流是通俗易懂的。不论多么复杂的新/旧技术,能简单的一定简简单单的讲出来。做到这一点其实不难,个人认为,作者只需用自己的话来讲就完全可以,越是照搬学术的东西,“貌似权威的”,却是缺少大众亲和力。毕竟大部分人学习的目的不是去作秀写论文,而是去写自己的实实在在的代码的。呵呵。愿IT界的明天更加美好吧。
闲言少叙,书归正传。
=======================================================================
WCF被推出来很久了,但是对于刚刚接触WCF的人们来说,想必会有以下问题:
WCF是什么?为什么我们需要WCF?WCF能给我们带来什么?学习WCF的难易度如何?
以上这些问题的答案在网上已经很多介绍了,我在此本不必再浪费口舌,只是大概提一下。
WCF: Windows Communication Foundation.从名字可以看出,这是一项和通信密切相关的技术。我们知道软件设计到处是通信。当然我们必须学了以后,才能更好的知道它、运用它,而不能单单从它的名字揣测它的威力如何。
WCF提供给了我们一种面向服务(SOA)的程序设计的解决方案:何为面向服务?之前有使用过.NET Web Service 开发的朋友,很容易理解面向服务是咋回事。.Net Web Service也是更早的时候微软提出的一种面向服务的解决方案。面向服务是一种标准,不同的公司可以给出各自的实现框架。单纯的讲SOA,毕竟太抽象了。学习一下SOA的一种实现比如.Net Web Service 或WCF以后,相信不用任何文字定义,你也会深刻地理解SOA。所以,何为面向服务?这里不解释,等你学一段时间的WCF,你自己就有答案了,真的,呵呵。
WCF提供了统一的通信模型:以前我们写通信可以是:TCP/UDP,Socket等这些方式,在WCF中被统一了。至于如何统一?这里先不说了。所以,当你在项目中同时使用了多种通信方式时,可以考虑使用WCF了。
以前没有接触过Web Service 开发接受WCF也不是难事,相信我!
这次,我们只做一点WCF的概述,更为详细的知识到后面再慢慢展开。边学习,边交流。
1. 打开VS 2010 -->file-->new Project ,选择C#下面的WCF,选择WCF Library。如下图:
2.此时有了IService 文件和一个Service 文件。Service文件实现的IService中的两个函数:GetData函数和GetDataUsingDataContract函数。至于这两个函数是干嘛的?想必不用说大家都能看懂的。之后详细说明他们的角色。这里也不修改类名和函数名了,方面起见。
3.按F5运行程序,此时打开了一个WCF 的一个测试 窗口。如下图:先测试GetData函数
测试结果:
同样的方法测试GetDataUsingDataContract函数:结果如下图
4.上面完成了对WCF的函数功能的简单测试,能说明的是Service正确地实现了IService。接下来我们需要将这个WCF部署到一个Web Site中。
在解决方案上面右击:New -->New Web Site 如下图:
修改web site项目中的Service.svc 文件里面的 Service="WcfFirstDemoServiceLib.Service1" (其中意思就是已命名空间加类名的方式指定service的名字)
5.添加一个winForm程序 ,用它来调用WCF的函数。
6.给winForm 项目添加web 引用:
7.在Form1上面添加几个控件,然后再在Form1.cs中添加下列几行代码:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using WCFClient.WCFServiceDemo; 10 11 namespace WCFClient 12 { 13 public partial class Form1 : Form 14 { 15 Service1Client proxy = null; 16 CompositeType ctin = null; 17 CompositeType ctout = null; 18 public Form1() 19 { 20 InitializeComponent(); 21 } 22 23 private void btnGetData_Click(object sender, EventArgs e) 24 { 25 this.tbOutputBox.Text = proxy.GetData(Convert.ToInt32(this.tbInputbox.Text)); 26 } 27 28 private void Form1_Load(object sender, EventArgs e) 29 { 30 proxy = new Service1Client(); 31 32 } 33 34 private void button2_Click(object sender, EventArgs e) 35 { 36 ctin = new CompositeType(); 37 ctin.StringValue = this.tbInputCTStrvalue.Text; 38 ctin.BoolValue = this.rboxInTrue.Checked; 39 40 ctout = proxy.GetDataUsingDataContract(ctin); 41 42 this.tbOutputCTStrvalue.Text = ctout.StringValue; 43 if (ctout.BoolValue) 44 { 45 this.rboxOutTrue.Checked = true; 46 } 47 else 48 { 49 this.rboxOutFalse.Checked = true; 50 } 51 52 } 53 } 54 }
8.Ctrl+F5 运行:
说明:这里只是概述WCF,所以全部在使用WCF的默认设置,也没有详细说明每一步的作用是什么。只是给出三个项目:项目1是WCF的库也是WCF功能核心。项目2是WCF的host用于向外界发布WCF提供的接口(注:接口这里指提供了哪些函数可被调用)。项目3是WCF的客户端用于调用WCF。其实,这里已经隐约体现出一点点分布式软件架构的意思了:有专门提供功能实现的模块,有专门提供对外公开接口的模块,有专门作为调用的模块。
后面详细WCF每一部分的。欢迎关注!!