第18章WCF开发基础.docx
- 文档编号:27473095
- 上传时间:2023-07-01
- 格式:DOCX
- 页数:31
- 大小:700.26KB
第18章WCF开发基础.docx
《第18章WCF开发基础.docx》由会员分享,可在线阅读,更多相关《第18章WCF开发基础.docx(31页珍藏版)》请在冰豆网上搜索。
第18章WCF开发基础
第18章WCF开发基础
VS2008
WCF(WindowsCommunicationFoundation)是.NETFramework的扩展,WCF提供了创建安全的、可靠的、事务服务的统一框架,WCF整合和扩展了现有分布式系统的开发技术,如Microsoft.NETRemoting、WebServices、WebServicesEnhancements(WSE)等等,来开发统一的可靠的应用程序系统。
18.1了解WCF
WCF是.NETFramework的扩展,同时WCF提供了一种在Windows环境下进行客户端开发和服务端开发的SDK,并且为服务提供了运行环境。
WCF提供了创建安全的、可靠的、事务服务的统一框架,整合了现有的分布式技术,开发人员能够使用WCF快速创建基于服务的应用程序。
18.1.1什么是WCF
WCF是基于Windows平台下开发和部署服务的软件开发包(SoftwareDevelopmentKit,SDK)。
WCF提供了服务的运行环境,这样就让开发人员能够将CLR类型公开为服务,也能够通过使用CLR类型来使用服务。
WCF框架模型如图18-1所示。
图18-1WCF框架模型
WCF提供了创建安全的、可靠的、事务服务的统一框架,WCF整合和扩展了现有分布式系统的开发技术,如Microsoft.NETRemoting、WebServices、WebServicesEnhancements(WSE)等等,来开发统一的可靠系统。
WCF简化了SOA框架的应用,同时也统一了EnterpriseServices、Messaging、.NETRemoting、WebServices、WSE等技术,极大的方便了开发人员进行WCF应用程序的开发和部署,同时也降低了WCF应用开发的复杂度。
WCF支持大量的WebService标准,这些标准包括XML、XSD、SOAP、Xpath、WSDL等标准和规范,所以对于现有的标准,开发人员能够方便的进行移植。
同时WCF可以使用Attribute属性进行WCF应用程序配置,提高了WCF应用的灵活性。
WCF遵循客户端/服务器模型在应用程序之间进行通信,客户端程序能够通过服务器端提供的EndPoint端直接访问服务,如图18-2所示。
图18-2WCF通信模型
虽然开发人员需要实现服务可以不使用WCF,但是WCF封装了现有的类和结构,提供了服务实现的便捷手段,通过使用WCF能够快速的实现服务并让其他的应用程序使用服务。
WCF是微软提供的一系列协议的标准,包括服务交互、类型转换等。
WCF中绝大部分的实现和功能都包含在一个单独的程序集System.ServiceModel.dll中,命名空间为System.ServiceModel。
通过使用System.ServiceModel命名空间能够快速搭建WCF应用程序环境。
WCF是.NET3.0的一部分,但是.NET3.0是基于.NET2.0为基础而存在的,如果需要搭建和使用WCF应用,则服务器应该具备.NET3.0环境。
18.1.2为什么需要WCF
在传统的应用程序开发中,例如在为麦当劳开发一个餐饮统计的应用程序,这个应用程序能够统计麦当劳的餐饮系统,包括每天客户购买的餐饮、餐饮的价格以及当天的餐饮统计。
这个应用程序通常是安装在麦当劳店面主机中的,但是有很多的应用程序将需要对此餐饮统计应用程序进行访问和数据提取,这些应用程序有的是基于.NET的,有的是基于J2EE的,另一些可能是基于ASP.NET的Web应用,这样就造成了应用程序访问困难。
如图18-3所示。
图18-3麦当劳业务模拟图
如图18-3中所示,麦当劳的餐饮业务也许需要支持很多其他的设备,在现在智能手机发达的今天,很多客户可能可以从移动客户端访问麦当劳的餐饮业务,这些移动客户端可能是PDA、WindowsMobile,GPhone或者IPhone。
在其他的客户端访问时,例如总部可能需要提取分部的数据,用户可以从网站中购买餐饮,分部经理需要对当天的数据进行统计,或者购物中心应用程序访问餐饮应用程序以增删数据,这些流程都必须考虑到平台、协议和通信等诸多因素。
WCF可以看作是ASMX、.NETRemoting、EnterpriseService、WSE、MSMQ这些技术的并集,虽然在复杂度上WCF很可能比这些技术更加复杂,因为WCF是面向服务构架的,所以对于上述的麦当劳餐饮业务的例子,如果使用WCF就能够很好的实现不同平台,不同设备之间的安全性、可依赖性、互操作性等特性,而因为WCF对现有技术的封装,开发人员可以无需关心ASMX,、NetRemoting这些技术的实现细节。
18.2WCF基础
在了解了WCF的概念和通信原理,以及为什么要使用WCF之后,就能够明白WCF在现在的应用程序开发中所起到的作用,WCF能够实现不同技术和平台之间的安全性、可依赖性和用户操作性的实现,对大型应用程序开发起到促进作用。
18.2.1服务
服务是一组公开的功能的集合。
在软件开发领域,从传统的面向过程,到面向对象,然后历经了面向组件的开发一致发展到当今的面向服务开发。
1.WCF服务
面向服务开发也并不是什么新技术,面向服务开发只是之前的面向过程、面向对象、组件开发和面向服务开发一种补充。
面向服务开发有如下优点:
❑重用性:
面向服务的开发提升了应用程序的重用性,通过创建可用于服务的接口能够实现不同应用程序中使用相同或类似程序实现的代码。
❑注重效率:
面向服务的开发可以使用现有的服务的集合,这样能够让开发人员能够快速的进行数据交换和开发,而无需关注底层服务的实现。
❑松耦合:
面向服务的应用程序是独立于服务执行环境的应用程序,这样就让应用程序成为一个松耦合的应用。
❑职责划分:
通过使用面向服务的开发能够进行职责的划分,例如经理和业务人员只需关心业务和统计数据即可,开发人员能够关注应用程序的开发。
一个面向服务的应用程序会将众多的服务集成到一起,形成单个逻辑单元,如图18-4所示。
图18-4面向服务的应用
WCF中的服务可以是本地的,也可以使用远程的服务。
对于客户端而言,客户端只需要通过使用服务来实现应用程序功能,这些客户端也可以是不同的类型,包括Windows应用程序,ASP.NET应用程序甚至是移动终端。
对于客户端而言,客户端是通过使用消息与服务器进行通信。
消息可以直接在客户端与服务之间进行传递,也可以通过中间方进行传递。
在服务器和客户端之间的消息是通过SOAP进行通信的,SOAP与Web应用开发中不同的是,Web应用通常需要某个具体的协议进行相应功能的实现,例如HTTP、FTP协议等,而在WCF中,WCF服务可以在不同的协议中进行传递,并不局限于某个协议。
正是因为如此,客户端与服务器之间的要求往往不是必须的,这也就是说,WCF客户端可以与一个非WCF服务器进行信息通信,而一个非WCF客户端也可以与一个WCF服务器进行信息通信。
为了保障WCF服务器的安全性,WCF服务器不允许直接对服务的调用。
对于WCF客户端,只允许使用代理(Proxy)将调用信息转发给服务器。
代理向客户端公开的操作和服务器端的操作相同。
2.服务的执行边界
WCF能够让客户端跨越执行边界与WCF服务进行通信,WCF客户端和WCF服务器进行通信必须使用带来与服务进行通信,即使是与本地服务进行通信,如图18-5所示。
图18-5展示了WCF客户与本机服务进行通信,WCF不仅能够支持不同应用程序域之间的服务的访问,也能够支持不同进程之间的服务的访问。
这就让WCF客户端可以调用一个应用程序中的服务,也可以调用不同应用程序甚至不同进程中的WCF服务。
不仅如此,WCF还支持客户端对远程计算机的中服务的调用,在远程服务调用中,WCF允许客户端可以跨越Intranet或Internet的边界进行远程服务的访问和调用,如图18-6所示。
图18-5WCF与本机服务进行通信图18-6WCF与远程服务进行通信
图18-6展示了WCF客户端与远程服务进行通信,无论WCF客户端是与远程服务进行通信还是与本地进程进行通信,都需要使用代理。
18.2.2地址
在Internet中,为了标识每个计算机,就需要使用IP进行地址划分,在生活中也有此实例,例如每个家庭都有一个门牌号,为了方便找到某个人,则必须通过门牌号找到这个人,同样对于WCF服务而言,每个WCF服务都有一个自己的地址。
1.WCF地址
WCF地址包含两个元素,服务位置与传输协议,服务位置包括目标机器名、站点或网络、通信端口、管道或队列,以及一个可选的特定路径或者URI。
WCF地址也可以是用于服务通信的传输样式。
WCF支持的传输样式包括:
❑HTTP:
超文本传输协议。
❑TCP:
传输控制协议。
❑Peernetwork:
对等网。
❑IPC:
基于命名管道的内部进程通信协议。
❑MSMQ:
微软消息队列。
地址通常通过[基地址]/[可选的URI]的格式进行WCF地址描述,示例地址如下所示。
http:
//localhost:
8731
http:
//localhost:
8731/18-2
net.tcp:
//localhost:
8731/server/18-2
net.pipe:
//localhost/18-2
net.msmq:
//localhost/18-2
其中关于http:
//localhost:
8731这个地址可以称作使用http协议,访问计算机为localhost的端口8731正在等待客户端的调用。
而对于http:
//localhost:
8731/18-2这个地址可以称作使用http协议,访问计算机为loacalhost的端口为8731的18-2服务正在等待客户端的调用。
2.TCP地址
TCP地址使用TCP传输控制协议作为通信协议,使用TCP地址的示例地址如下所示。
net.tcp:
//localhost:
8731/server/18-2
如果端口号没有指定,则TCP会使用默认端口号808作为其默认端口,示例地址如下所示。
net.tcp:
//localhost/server/18-2
3.HTTP地址
HTTP地址使用HTTP传输控制协议作为其通信协议,使用HTTP地址的示例地址如下所示。
http:
//localhost:
8731/18-2
如果端口号没有指定,则HTTP会使用默认的端口号80作为其默认端口。
注意:
无论是TCP协议还是HTTP协议,不同的服务可以公用相同的端口号。
4.IPC和MSMQ地址
IPC地址使用net.tcp作为通信协议,使用net.tcp地址的示例地址如下所示。
net.pipe:
//localhost/18-2
正是因为IPC地址使用net.pipe进行传输,所以IPC地址将使用Windows的命名管道机制。
在WCF中,如果服务使用命名管道,则该服务只能接收来自同一台客户端计算机的调用。
因此,在使用时必须明确的指定WCF提供服务的计算机名,从而为管道名提供一个惟一的标识字符串。
而MSMQ地址使用net.msmq进行传输,即使用了微软消息队列机制,MSMQ地址的示例地址如下所示。
net.msmq:
//localhost/18-2
18.2.3契约
在WCF中,所有的WCF服务都会被公开成为契约。
契约是服务的功能的标准描述方式,通常情况下WCF包含四种类型的契约,这些契约如下所示。
❑服务契约(ServiceContract):
服务契约定义了客户端能够执行的操作,服务契约是WCF中使用最为广泛的一种契约。
❑数据契约(DataContract):
数据契约定义了客户端与服务器之间交互的数据类型。
❑错误契约(FaultContract):
错误契约定义了操作中出现的异常,包括定义服务出现的错误并传递返回给客户端。
❑消息契约(MessageContract):
消息契约允许服务直接与消息交互,但是WCF很少使消息契约。
WCF使用特性ServiceContractAttribute标识服务契约,而使用OperationContractAttribute标识服务方法。
示例代码如下所示。
[ServiceContract]//标识服务契约
publicinterfaceIService1//实现接口
{
[OperationContract]//方法声明
stringGetData(intvalue);//创建方法
[OperationContract]
CompositeTypeGetDataUsingDataContract(CompositeTypecomposite);
//任务:
在此处添加服务操作
}
上述代码使用ServiceContractAttribute标识服务契约,而使用OperationContractAttribute标识服务方法,OperationContract只能用于方法,指明客户端是否能够调用此方法。
使用OperationContract标识可以标识私有方法以使用SOA的方式进行构架,虽然这样是可以实现客户端调用,但是作为面向对象的设计是不推荐使用该方法的。
由于能够使用ServiceContractAttribute来标识服务契约,开发人员能够自定义标识指定相应的方法是否能够被客户端调用,示例代码如下所示。
[OperationContract]
CompositeTypeGetDataUsingDataContract(CompositeTypecomposite);//标识方法
stringPost(stringcontent);
在上述代码中的Post方法不会成为契约。
WCF允许开发人员使用DataContractAttribute、DataMemberAttribute来标识自定义数据类型和属性,示例代码如下所示。
[DataMember]//设置DataMember
stringstringValue="Hello";//创建string变量
[DataMember]//设置DataMember
publicboolBoolValue//设置属性
{
get{returnboolValue;}
set{boolValue=value;}//设置属性默认值
}
[DataMember]//设置DataMember
publicstringStringValue//设置属性
{
get{returnstringValue;}
set{stringValue=value;}//设置属性默认值
}
上述代码使用了DateMember定义了属性和相应的字段,这样就可以在服务方法中传递复杂的数据体了。
18.3WCF应用
在了解了基本的WCF概念后,先不用着急继续了解WCF应用体系,通过创建WCF应用可以深入的了解服务、地址和契约的概念。
WCF还允许开发人员创建和声明契约,通过契约的声明,客户端可以通过远程调用以实现自身的程序。
18.3.1创建WCF应用
在VisualStudio2008中,可以方便的创建WCF应用。
在菜单栏中选择【文件】选项,在下拉菜单中单击【新建项目】选项,在弹出的【新建项目】窗口中选择WCF,如图18-7所示。
图18-7创建WCF服务库
创建WCF服务库后,应用程序会自动生成Server1.cs和IServer1.cs接口,IServer1.cs接口示例代码如下所示。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;//使用必要的命名空间
usingSystem.Runtime.Serialization;//使用必要的命名空间
usingSystem.ServiceModel;//使用必要的命名空间
usingSystem.Text;
namespace_18_2
{
//注意:
如果更改此处的接口名称“IService1”,也必须更新App.config中对“IService1”的引用。
[ServiceContract]
publicinterfaceIService1
{
[OperationContract]//声明契约
stringGetData(intvalue);
[OperationContract]
CompositeTypeGetDataUsingDataContract(CompositeTypecomposite);
//任务:
在此处添加服务操作
}
//使用下面示例中说明的数据协定将复合类型添加到服务操作
[DataContract]
publicclassCompositeType//创建类
{
boolboolValue=true;//创建字段
[DataMember]
stringstringValue="Hello";//声明string变量
[DataMember]
publicboolBoolValue//创建属性
{
get{returnboolValue;}
set{boolValue=value;}
}
[DataMember]
publicstringStringValue//创建属性
{
get{returnstringValue;}
set{stringValue=value;}
}
}
}
上述代码创建了一个IServer1接口,并通过ServiceContractAttribute标识服务契约,同样也通过DataContractAttribute、DataMemberAttribute来标识自定义数据类型和属性,示例代码如下所示。
[ServiceContract]//标识服务契约
publicinterfaceIService1//创建接口
[DataContract]
publicclassCompositeType
创建接口后则需要实现接口,接口的实现在Server.cs文件内,示例代码如下所示。
publicclassService1:
IService1//实现接口
{
publicstringGetData(intvalue)//实现接口方法
{
returnstring.Format("Youentered:
{0}",value);//返回string值
}
publicCompositeTypeGetDataUsingDataContract(CompositeTypecomposite)//实现接口方法
{
if(composite.BoolValue)//实现方法代码
{
composite.StringValue+="Suffix";//添加相应数据
}
returncomposite;//返回值
}
上述代码实现了IServer1接口中的方法,单击【运行】按钮或快捷键【F5】,WCF应用程序就能够运行,如图18-8所示。
从图18-8中可以看出,在Server1.cs文件中实现的方法都能够在测试客户端中看到,单击测试客户端中相应的方法就能够在客户端测试调用服务器端的方法,如图18-9所示。
图18-8服务测试客户端图18-9测试方法调用
双击GetData方法后,在右侧选项卡中就会分为两层,这两层分别为请求和响应。
在请求框中可以在值那一栏编写需要传递的值,编写完毕后单击【调用】按钮就能够实现服务器端方法的调用并在响应框中呈现相应的值。
18.3.2创建WCF方法
一个简单的WCF应用程序运行后,就会发现其实WCF并没有想象中的复杂。
WCF允许开发人员通过使用ServiceContractAttribute标识服务契约,同样开发人员还能够创建服务契约以提供客户端的方法的调用。
在IServer1接口中首先需要定义该方法,示例代码如下所示。
intGetSum(DateTimetime);//定义接口方法
[OperationContract]//标识调用
stringGetShopInformation(stringaddress);
上述代码声明了两个方法,这两个方法分别为GetSum和GetShopInformation,,GetSum用于获取某一天麦当劳餐厅中出售总量,而GetShopInformation用于获取麦当劳地址和一些商店的信息,GetSum和GetShopInformation具体实现如下所示。
publicintGetSum(DateTimetime)//实现方法
{
intBreadNum=10;//声明必要字段
intMilk=5;//声明必要字段
intHotDryNuddle=20;//声明必要字段
inttoday=BreadNum+Milk+HotDryNuddle;//实现计算
returntoday;//返回值
}
publicstringGetShopInformation(stringaddress)//实现方法
{
if(address=="武汉")//判断地址
{
return"武汉麦当劳连锁店";//返回相应结果
}
elseif(address=="北京")//判断地址
{
return"北京麦当劳连锁店";//返回相应结果
}
elseif(address=="上海")//判断地址
{
return"上海麦当劳连锁店";//返回相应结果
}
else
{
return"没有该连锁店";//返回默认结果
}
}
在GetSum方法中,用于获取当天的销售总量,而GetShopInformation实现了商店信息的反馈,运行后如图18-10所示。
图18-10创建方法
从图18-10中可以看出,GetShopInformation已
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 18 WCF 开发 基础
![提示](https://static.bdocx.com/images/bang_tan.gif)