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中添加下列几行代码:

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每一部分的。欢迎关注!!

posted @ 2012-07-26 00:51  MarkSun  阅读(3054)  评论(22编辑  收藏  举报