wcf通讯协议Word下载.docx
《wcf通讯协议Word下载.docx》由会员分享,可在线阅读,更多相关《wcf通讯协议Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
我们通过单向(one-way)的模式调用calculuateservice(也就是客户端不可能通过回复消息得到计算结果),服务端在完成运算结果后,通过回调(callback)的方式在客户端将计算结果打印出来。
整个应用的层次仍然采用我们一贯的4层结构:
contracts、services、hosting和clients,如图3所示。
图3双工通信案例应用结构
步骤一:
定义服务契约和回调契约
首先进行服务契约的定义,我们照例通过接口(icalculator)的方式定义服务契约,作用于指定加法运算的add操作,我们通过
operationcontractattribute特性的isoneway属性将操作定义成单向的操作,这意味着客户端仅仅是向服务端发送一个运算的请求,并不会通过回复消息得到任何运算结果。
1:
usingsystem.servicemodel;
2:
namespaceartech.duplexservices.contracts
3:
{
4:
[servicecontract(namespace="
/"
5:
callbackcontract=typeof(icallback))]
6:
publicinterfaceicalculator
7:
8:
[operationcontract(isoneway=true)]
9:
voidadd(doublex,doubley);
10:
}
11:
我们试图实现的是通过在服务端回调客户端操作的方式实现运算结果的输出。
客户端调用calculatorservice正常的服务调用,那么在服务执行过程中借助于客户端在服务调用时提供的回调对象对客户端的操作进行回调,从本质上讲是另外一种形式的服务调用。
wcF采用基于服务契约的调用形式,客户端正常的服务调用需要服务契约,同理服务端回调客户端依然需要通过描述回调操作的服务契约,我们把这种服务契约称为回调契约。
回调契约的类型通过
servicecontractattribute特性的callbackcontract属性进行指定。
上面代码中服务契约icalculator的回调契约icallback定义如下。
由于回调契约本质也是一个服务契约,所以定义方式和一般意义上的服务契约基本一样。
有一点不同的是,由于定义icalculator的时候已经通过
[servicecontract(callbackcontract=typeof(icallback))]指明icallback是一个服务契约了,所以icallback不再需要添加servicecontractattribute特性。
icallback定义了一个服务操作displayResult用于显示运算结果(前两个参数为执行加法运算的操作数),由于服务端不需要回调的返回值,索性将回调操作也设为单向方法。
publicinterfaceicallback
voiddisplayResult(doublex,doubley,doubleresult);
步骤二:
实现服务
在实现了上面定义的服务契约icalculator的服务calculatorservice中,实现了add操作,完成运算和结果显示的工作。
结果显示是通过回调的方式实现的,所以需要借助于客户端提供的回调对象(该对象在客户端调用
calculatorservice的时候指定,在介绍客户端代码的实现的时候会讲到)。
在wcF中,回调对象通过当前operationcontext的getcallback方法获得(t代表回调契约的类型)。
usingartech.duplexservices.contracts;
namespaceartech.duplexservices.services
publicclasscalculatorservice:
icalculator
#regionicalculatormembers
publicvoidadd(doublex,doubley)
doubleresult=x+y;
12:
icallbackcallback=
operationcontext.current.getcallbackchannel();
13:
callback.displayResult(x,y,result);
14:
15:
16:
#endregion
17:
18:
注:
operationcontext在wcF中是一个非常重要、也是一个十分有用的对象,它代表服务操作执行的上下文。
我们可以通过静态属性current(operationcontext.current)得到当前的operationcontext。
借助operationcontext,我们可以在服务端或者客户端获取或设置一些上下文,比如在客户端可以通过它为出栈消息(outgoingmessage)添加soap报头,以及http报头(比如cookie)等。
在服务端,则可以通过operationcontex获取在客户端设置的soap报头和http报头。
关于operationcontext的详细信息,可以参阅msdn在线文档。
步骤三:
服务寄宿
我们通过一个控制台应用程序完成对calculatorservice的寄宿工作,并将所有的服务寄宿的参数定义在配置文件中。
由于双工通信依赖于一个双工的信道栈,即依赖于一个能够支持双工通信的绑定,在此我们选用了nettcpbinding。
1:
7:
contract="
artech.duplexservices.contracts.icalculator"
/>
在wcF预定义绑定类型中,wsdualhttpbinding和nettcpbinding均提供了对双工通信的支持,但是两者在对双工通信的实现机制上却有本质的区别。
wsdualhttpbinding是基于
篇二:
使用wcF分布式应用程序通信
使用wcF分布式应用程序通信windows基础通信(wcF)是.net框架(.netFramework)的一个子集,它是为提升分布式应用环境的相互操作性而设计的。
随着web服务(webservices)的认可,以及相关协议和标准的诞生,使分布式应用程序发展成为了开发规范。
wcF的引入简化了面向服务的编程模型,在其基础上提供异步和非类型消息传递。
从底层扩展选项和协议,让开发者在传输方式和编码方法上有很多配置选择。
序言
windows基础通信(wcF)是.net框架(.netFramework)的一个子集,它是为提升分布式应用环境的相互操作性而设计的。
.netRemoting,.netwebservices和企业服务这些熟悉的技术将被认可,在wcF里就会有熟练的开发经验。
除了那些老技术,wcF的序列化功能可以允许不同平台的松散藕合的分布式应用程序。
这允许每个应用程序开发环境要更加独立且较少的维护。
wcF可以与现有的.net框架技术整合,如com+、webservicesenhancements(wse)、消息列队或更多其他。
wcF有自己的一套术语和表达形式。
在开始之前,一下内容要重点了解:
查看原图
通过这里了解更多wcF的术语和定义:
9.aspx
不论你是在不同的平台、整个互联网或相同的服务器上开发wcF应用程序,下面是构建wcF应用程序的步骤:
定义一个服务协定实现协定配置服务托管服务
通过客户端调用服务
下面的演示使用控制台应用程序来创建一个服务,并通过wpF客户端应用程序来调用该服务。
这个wpF客户端应用程序可以从服务检索产品列表,展现给用户且允许用户删除个别产品。
首先,用Visualstudio创建一个名为wcFproductservice的控制台应用程序。
本演示用到一个名为product的类。
本例子的数据将在实例运行是被创建,但是你可能需要通过数据库检索数据。
usingsystem;
usingsystem.collections.generic;
usingsystem.linq;
usingsystem.text;
namespacewcFproductservice{
publicclassproduct{
publicproduct(){}
publicintproductid{get;
set;
publicstringproductname{get;
publicstringproductdesc{get;
publicintinventory{get;
publiclistgenerateproductlist(){
listreturnlist=newlist();
returnlist.add(newproduct(){productid=1,productname="
ball"
productdesc="
white,Round"
inventory=10});
returnlist.add(newproduct(){productid=2,productname="
bat"
wood"
inventory=7});
returnlist.add(newproduct(){productid=3,productname="
glove"
brown,leather"
inventory=3});
returnlist.add(newproduct(){productid=4,productname="
helmet"
headprotection"
inventory=12});
returnlist.add(newproduct(){productid=5,productname="
pads"
bodyprotection"
returnlist.add(newproduct(){productid=6,productname="
jersey"
teamspirit"
inventory=2});
returnlist.add(newproduct(){productid=7,productname="
FoamFinger"
productdesc="
awesome"
inventory=23});
returnlist.add(newproduct(){productid=8,productname="
tape"
injuryprevention"
inventory=102});
returnlist.add(newproduct(){productid=9,productname="
club"
9iron"
inventory=11});
returnlist.add(newproduct(){productid=10,productname="
bag"
holdsclubs"
inventory=6});
returnreturnlist;
}
product.cs
定义服务协定
要创建服务协定先通过“解决方案资源管理”添加system.servicemodel.dll应用,然后还要用"
using"
语句给项目添加system.servicemodel命名空间。
usingsystem.servicemodel;
program.cs
接下来定义一个名为iproductmanager接口并应用servicecontract属性。
本例子指定"
namespace"
属性的值为"
http:
//companyname.productmanager"
。
最好给它显式指定命名空间,因为这样可防止将默认命名空间值添加到协定名称。
该接口会在后面的实现服务协定中用到。
在iproductmanager接口中,你要给协定每个公的开操作声明一个方法。
添加检索产品列表和一个删除产品的方法,给每个你想公开的方法添
加operationcontract属性。
当你完成的时候,该接口类似于以下代码:
//...
[servicecontract(namespace="
//companyname.wcFproductservice"
)]publicinterfaceiproductmanager{
[operationcontract]listgetallproducts();
[operationcontract]voiddeleteproduct(intn1);
program.cs
实现协定
在通过接口创建协定之后要实现该接口。
创建一个名
为productmanagerservice的类并实现iproductmanager接口。
然后实
现productmanagerservice类接口里每个方法。
完成后的代码应该类似于这样:
//...
publicclassproductmanagerservice:
iproductmanager{
publiclistgetallproducts(){
if(masterproductlist==null)masterproductlist=newlist();
if(masterpr(wcf,通讯协议)oductlist.count==
0)masterproductlist=product.generateproductlist();
returnmasterproductlist;
publicvoiddeleteproduct(intn1){
if(masterproductlist==null){
//throwandhandleexception
varproducttodelete=(frompinmasterproductlistwherep.productid==n1selectp).Firstordefault();
masterproductlist.Remove(producttodelete);
配置服务
在实现服务协定之后,现在开始配置服务。
配置服务包括确定、定义如何公开服务、协定的位置、安全类型与用于发送和接受的信息编码。
wcF提供了丰富的配置选项。
有两种基本的方法来设置服务配置:
1、使用内嵌的代码(本演示使用)配置;
2、使用配置文件(充分利用.net框架的配置技术,当wcF服务托管在iis里时,可以从web.config文件来配置)。
对于那些希望通过服用增增加效率的,wcF包括绑定形式的公用配置,使你可以快速更多的基本特点。
绑定可以通过内嵌或配置文件里的xml元素。
在本演示中,wcFproductservice使用代码basichttpbinding绑定到配置服
务。
basichttpbinding没有提供默认的安全,因此只能应用于安全的网络环境或增加安全性。
一份关于wcF提供绑定与相关细节,具体可以查看:
在main方法里添加一个具有以下属性的basichttpbinding对象:
basichttpbindingbinding=newbasichttpbinding();
binding.messageencoding=wsmessageencoding.text;
binding.security.mode=basichttpsecuritymode.none;
//default
basichttpbinding对象上面有很多配置各种不同方面服务的属性。
需要花些时间类熟悉,因为不是所有的配置都有用。
但为了保证最佳配置,有必要都了解一下。
接下来的配置步骤是端点,端点是确定wcF的位置和收集有关wcF服务的信息。
协定的配置信息和地址组合成端点。
协定地址和配置地址已经脱离了代码或端点位置,也可以执行。
(原文:
thecontractandconfigurationhasalreadybeencodedleavingtheaddress,orendpointlocation,tobeimplemented.)
在main方法里船舰一个新url对象,作为服务的基本地址。
uriaddress=newuri("
//localhost:
8000/wcFproductservice"
);
最后的配置是通过元素据实服务被发现。
在system.servicemodel.description命名空间里,有一个名
为servicemetadatabehavior的类,该类允许你配置你的wcF服务当被请求时
来发布它自身的原数据。
对于那些熟悉webservices的,发现生成wsdl和web引用同样类似地添加到你的项目。
相反地,创建一个可被发现的服务,使webservice代理可以在客户端创建,你将在下文中看到。
为了是元素据能被找到,首先用using添加一
个system.servicemodel.description引用。
接下来在main方法创建一
个servicemetadatabehavior对象,并将它的httpgetenabled属性设为true。
下一步,添加servicehost对象。
usingsystem.servicemodel.description;
servicemetadatabehaviorsmdb=newservicemetadatabehavior();
smdb.httpgetenabled=true;
提示:
因为暴露的攻击与安全问题,默认情况下禁用元素据的发布。
使用
servicemodel元数据使用工具代替,不需要你发布服务的元数据,你仍然能够直接从你的服务程序集产生元素据和客户端代码。
托管服务
现在服务已经被定义,实现和配置。
该是创建服务托管对象来托管服务和通过端点发布服务的时候了。
第一步,创建一个新servicehost对象托管wcF服务。
usethebaseaddressuriobjectcreatedinthepreviousstepandfortheimplementationoftheservicecontractuseproductmanagerservice.接下来给servicehost对象添加服务端点。
给iproductmanager接口传递之前创建的绑定对象和端点地址(注意:
这里地址是相对于基本地址
的servicehost对象使用)。
然后,启动服务,给上一步servicehost对象的description.behaviors集合创建servicemetadatabehavior对象。
open()方法是servicehost对象告诉服务开始等待传入消息,close()方法停止服务。
当完全这些后,program.cs的main方法类似以下这样:
staticvoidmain(string[]args){
binding.security.mode=basichttpsecuritymode.none;
//default
8000/wcFproductse