代码改变世界

WCFStudying 1——自行构建简单的WCF服务

2009-08-15 10:31  独孤残云  阅读(723)  评论(13编辑  收藏  举报
写在开篇——本文纯面向WCF初学者,高手在看到此页的同时请在第一时间点击浏览器关闭按钮~~
本文作者:月云
博客地址:http://www.cnblogs.com/kenkao
Artech大哥的WCF系列文章有一段时间了,奈何自己头脑不开窍,总感觉抓不住要诀。假期和几个同学帮校方做了一个文献搜索项目,异地的数据处理是用从Artech大哥那里学到的WCF技术加以解决的,虽然只有皮毛的水平。
项目完成的差不多时,整理了过往自己比较凌乱的思路,试着写了几个简单的WCF服务,感觉对这个领域的技术有了更深一层的了解。在这里对Artech大哥深表感谢~~
以下是一个简单的WCF服务,没有什么特别之处,架构也是访Artech的。整理出来加深一下自己的印象,同时希望能为和我一样徘徊在WCF门外无从下手的初学者们提供一些便利:
1.构建WCF服务框架

各个项目的用途分别如下:
KenKao.SuperWcfSvc.Client——客户端
KenKao.SuperWcfSvc.Contract——服务契约
KenKao.SuperWcfSvc.Hosting——虚拟环境
KenKao.SuperWcfSvc.Service——服务实体
KenKao.SuperWcfSvc.WebHosting——针对IIS的虚拟环境
2.构建WCF服务契约
契约——顾名思义,就是服务端与客户端统一遵守的服务调用形式。
KenKao.SuperWcfSvc.Contract.IWcfSvcCtrc.cs源码如下:
Code
所谓的服务契约,具体反映到WCF里大都以接口的形式出现。这样做的原因有二:便于服务端与客户端共享契约;增加了服务实体对于客户的安全度和灵活度。
对于初学WCF服务的朋友而言,所谓的WCF契约比之构建普通接口所作的工作有二:1>添加引用System.ServiceModel.dll并引入相应的命名空间;2>将对外暴露的契约接口修饰以[ServiceContract]属性,将契约内部对外暴露的方法修饰以[OperationContract]属性。这样一个WCF服务契约就构建完毕了。
3.构建WCF服务实体
KenKao.SuperWcfSvc.Service.WcfSvc.cs源码如下:
Code
因为相对于客户端而言,服务实体位于服务契约的下层,因此无需再依靠System.ServiceModel.dll及其相关属性的支持。为建立服务实体与契约间的层次关系,我们引入using KenKao.SuperWcfSvc.Contract,并使得实体继承自契约接口。
服务实体构建完毕。
4.构建WCF服务虚拟环境
KenKao.SuperWcfSvc.Hosting.WcfSvcHost.cs源码如下:
Code
因为需要实体和契约的支持,所以,我们引入相应的命名空间KenKao.SuperWcfSvc.Service和KenKao.SuperWcfSvc.Contract。
窗体界面布置如下:

除此之外,我们还要为程序集添加相应的配置文件——这是构建服务虚拟环境的重要部分。
KenKao.SuperWcfSvc.Hosting.App.config源码如下:
Code
这里值得一提的是整个配置文件的结构——这些内容也恰恰反映着WCF的一些基本的必备属性:
<behaviors>:服务行为节。
其中<serviceMetadata httpGetEnabled="true" />一句是至关重要的。只有这样,服务和客户端的交互行为才能够被激活。否则,服务是被禁止使用的。
<endpoint>:服务终结点。
一个个的服务终结点是用以构建整个WCF服务的基本元素。而每个终结点有由基本的A(address)、B(Binding)、C(contract)三元素构成,它们分别标明了“到哪里交互”“交互工作”“交互细节”等必要内容。
<baseAddresses>:基地址节。
如果宿主不是IIS,则此节是必须的。我们再看实例中<endpoint>的A元素,其内容为空。这表明,此服务终结点通过基地址直接访问。如果程序中有多个终结点,则我们可以分别赋予他们不同的address,这些address将和基地址联合构成终结点的URI,其效果大致相当于二级目录。
程序写到这里,一个完整的WCF服务基本就构建完毕了。我们可以运行查看效果。
在浏览器中输入我们给出的服务URI,可以弹出相应的测试界面:

这里的WCF服务虚拟环境的宿主为WinForm程序,用下面的方法可以将已有的WCF服务host到IIS里:
5.构建WCF服务的web虚拟环境
为项目KenKao.SuperWcfSvc.WebHosting添加WCF服务文件SuperWcfSvc.svc,此时相应的后台代码文件SuperWcfSvc.svc.cs也会一并生成,这里我们将其删除不用。并相应的修改SuperWcfSvc.svc里的内容,删除CodeBehind="SuperWcfSvc.svc.cs",而后将Service属性指定到我们先前定义的服务实体类下。
以下是KenKao.SuperWcfSvc.WebHosting.SuperWcfSvc.svc的内容:
<%@ ServiceHost Language="C#" Debug="true" Service="KenKao.SuperWcfSvc.Service.WcfSvc"%>
然后我们为网站的web.config文件添加相应的服务信息:

红色框框里的内容是在原有web.config的基础上新增的内容,其实,这部分内容大可以从app.config中复制过来而后去掉基地址节点的信息。
右击SuperWcfSvc.svc文件,选择从浏览器中查看,我们便可以看到一个和刚刚的测试页一摸一样的页面,不同的是他们的URI指定方式不同,前者为基地址指定,后者为IIS虚拟目录指定。
6.构建相应的测试客户端
由于此次意在为大家讲解初步的WCF服务构建,因此我暂时不打算像Artech大哥那样直接使用自行构建的客户类来完成客户对服务的访问。在这里,我们使用微软官方提供的最最初级的方法——添加服务引用法来完成客户端的构建。
该方法的步骤如下:
1>右击客户端项目的引用项---->单击添加服务引用,则弹出服务引用添加对话框:

这里,我们设定地址为事先制定的WCF服务地址:http://202.206.193.116:8080/SuperWcfSvc
点击前往,则会出现图中的结果,证明服务可用。而后自行编写一个服务的命名空间,单击确定,便完成了服务代理在客户端的构建。这里的服务代理所产生的效果,就好像客户端同样拥有一份服务代码的拷贝一样,起到关键作用的是添加服务过程中客户端本地生成的app.config文件。
KenKao.SuperWcfSvc.Client.app.config源码如下:
Code
和服务端的app.config相比,这里细化了<bindings>节的信息,<client>节的信息和服务端的主体信息完全一致,也只有这样,才能保证客户端和服务端的顺利交互。
下面,我们看如何在客户端宿主程序中调用服务端提供的方法:
KenKao.SuperWcfSvc.Client.ClientFrm.cs源码如下:
Code
窗体布置如图:

下面,我们运行程序,在前两个编辑框里输入两个数,点击按钮,客户端便会调用服务端方法将得出的结果显示在第三个编辑框里。由于只是简单的演示程序,所以,这里并没有过度考虑程序的严谨问题。
同样,我们也可以事先将该程序集host到IIS里,利用我们的KenKao.SuperWcfSvc.WebHosting来获取服务的URI,再以此URI来添加服务引用,效果是相同的,在这里不再赘述。
7.总结
通过以上的步骤,便完成了一个简单而规范的WCF服务的创建。没有难点、轻车熟路~~ 呵呵……
点击下载相应的源码:https://files.cnblogs.com/kenkao/KenKao.SuperWcfSvc.rar
8.参考资料加强力推荐~~
Artech(蒋金楠) 《我的WCF之旅》系列文章