面向服务的WCF编程(二)

本文介绍了WCF和HTTP编程的基础知识,包括HTTP的工作原理、特点及其请求与响应过程。同时对比了几种基于C/S架构下HTTP应用编程的技术实现,如可插接式协议、HttpWebRequest/HttpWebResponse以及WCF的不同之处。还详细探讨了WCF中HTTP绑定的选择及客户端与服务端间的消息交换模式。
摘要由CSDN通过智能技术生成

第八章 WCF和HTTP应用编程

课后习题:

1.编写基于C/S的HTTP应用程序时,有哪几种实现技术?各自的特点是什么?

①用可插接式协议实现
可插接式协议用WebRequest类和WebResponse类来实现。这两个类是各种与具体的通信协议相关的类的基类,提供了上传、下载等基本方法。或者说不论采用的是哪种通信协议,都可以用这两个类来实现。
②用HttpWebRequest和HttpWebResponse实现
HttpWebRequest类和HttpWebResponse类是针对HTTP而提供的,分别从WebRequest类和WebResponse类继承而来。
③用WCF实现
用WCF和基于任务的编程模型实现HTTP应用编程是面向服务编程中建议的做法

前两种方式都是传统的编程模型,在实际项目中,如果用传统的编程模型来实现,除了业务处理之外,很多细节也都需要程序员自己去完成,例如负载平衡、网络监视、安全管理、防范攻击等。而用WCF来实现,程序员只需要处理业务逻辑即可,其他工作让WCF内部去完成就行了。

2.WCF客户端和服务端的消息交换模式有哪些?

请求/应答模式、单向模式、双工模式。

8.1HTTP简介

超文本传输协议
在TCP/IP体系结构中,HTTP属于应用层协议,位于TCP/IP的顶层
HTTP定义Web客户端(一般是浏览器)如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端
HTTP用于客户端与服务器之间传递超文本文件

8.1.1HTTP的特点

①HTTP以TCP方式工作:HTTP客户端首先与服务器建立TCP连接,然后客户端通过套接字发送HTTP请求,并通过套接字接收HTTP响应
②HTTP是无状态的:客户端发送一次请求后,服务器并没有存储关于该客户端的任何状态信息。即使客户端再次请求同一个对象,服务器仍会重新发送这个对象,而不管原来是否已经向该客户端发送过这个对象
③HTTP使用元信息作为标头:HTTP通过添加标头(Header)的方式向服务器提供本次HTTP请求的相关信息,即在主要数据前添加一部分信息,称为元信息(如:传送的对象属于哪种类型,采用的是哪种编码)

8.1.2HTTP的请求与响应

1.HTTP请求

设置请求方式:可以用HttpWebRequest的【Method】属性设置请求的方法。如果不设置【Request】属性,系统默认请求的方法为“GET”
例如:下面代码设置HTTP请求的方法为“POST”

string uri="http://www.google.cn";
HttpWebRequest request =(HttpWebRequest)HttpWebRequest.Create(uri);
request.Method="POST";

当客户端将HTTP请求发送到服务器时,其内部发送格式如下所示:

<request-line>//第1行必须是一个请求行,说明请求的类型、要访问的资源以及使用的HTTP版本
<headers>//标头部分,说明服务器要使用的附加信息,这部分一般由多行组成
<blank-line>//标头之后是一个空行
[<request-body>]//空行之后是请求的主体,主体中可以包含任意的数据

(1)GET请求
表示客户端告诉服务器获取哪些资源
GET请求后面跟随一个网页的位置。除了页面位置作参数之外,这种请求还可以跟随协议的版本如HTTP/1.0等作为参数,以发送给服务器更多的信息
(2)POST请求
POST请求要求服务器接收大量的信息。与GET请求相比,POST请求不是将请求参数附加在URL后边,而是在请求主体中为服务器提供附加信息
POST请求一般用于客户端填写包含在Web表单(Form)中的内容后,将这些填入的数据以POST请求的方式发送给服务器
对于ASP.NET网页,当用户通过客户端浏览器在Web页面中填入数据,然后单击提交按钮时,客户端向服务器发送的就是POST请求
(3)HEAD请求
HEAD请求在客户端程序和服务器端之间进行交流,而不会返回具体的文档,因此HEAD方法通常不单独使用,而是和其他的请求方法一起起到辅助作用

2.HTTP响应

客户端向服务器发送请求后,服务器会回送HTTP响应
HTTP响应的一般格式:

<status-line>
<headers>
<blank-line>
[<response-body>]

对于HTTP响应来说,它与HTTP请求相比,唯一的区别是第1行用状态信息代替了请求信息。状态行(Status-line)通过提供一个状态码来说明所请求的资源情况。
所有HTTP响应的第一行都是状态行,该行内容依次是当前HTTP版本号、3位数字组成的状态码以及描述状态的短语,各项之间用空格分隔。例如:HTTP/1.1 200 OK
状态码的第一个数字代表当前响应的类型,具体规定如下
1×× 消息:请求已被服务器接收,继续处理
2×× 成功:请求已成功被服务器接收、理解、并接受
3×× 重定向:需要后续操作才能完成这一请求
4×× 请求错误:请求含有词法错误或者无法被执行
5×× 服务器错误:服务器在处理某个正确请求时发生错误

8.1.3HTTP编程技术选择

1.WebRequest类和WebResponse类

请求/响应模型的抽象(abstract)基类
它允许使用该请求/响应模型的应用程序可以用协议不可知的方式从Internet请求数据

2.HttpWebRequest类和HttpWebResponse类

通过HTTP协议和服务器交互

3.使用WCF实现HTTP应用编程(建议)

程序员只需要处理业务逻辑即可,其他工作细节让WCF内部去完成就行了

8.2WCF中与HTTP相关的绑定

8.2.1基本Http绑定(BasicHttpBinding类)

基本HTTP绑定用BasicHttpBinding类来实现,在配置文件中用basicHttpBinding元素来配置
利用BasicHttpBinding,可轻松实现类似传统的Web服务实现的功能

默认值及可选参数:

  • 安全模式
  • 消息编码(massageEncoding)消息文本字符编码(textEncoding)
  • 传输方式(transferMode)
  • 是否支持会话、事务、双工
  • 其他

8.2.2其他常用的HTTP绑定

1.安全HTTP绑定(WSHttpBinding类)

适用于非双工服务
WS-Security规范(保证了信息安全性和身份)

2.双工安全HTTP绑定(WSDualHttpBinding类)

使用HTTP作为基础传输协议
在服务端和客户端配置文件中用wsDualHttpBinding元素来配置
使用“文本/XML”作为默认的消息编码
仅支持SOAP安全模式,且需要可靠的消息传递

8.3WCF客户端和服务端的消息交换模式

8.3.1请求应答模式(Action/Reply)

客户端向WCF服务端发送请求后,服务端执行服务操作,并将操作结果返回到客户端。客户端如果不是通过异步操作来调用的,在服务端返回服务操作结果之前,客户端代码将处于阻塞状态。

8.3.2单向模式(IsOneWay)

客户端调用WCF服务操作时,服务端不向客户端返回操作结果。即使服务端出现执行错误,它也不会向客户端返回结果
单向模式的优缺点
优点:速度比“请求/应答”模式快
缺点:当服务端执行过程中出现错误时,由于客户端接收不到任何返回的消息,因此也无法发现服务端是否正确执行了操作方法
单向模式例子步骤:
①定义服务协定
该模式是通过在操作协定的参数中将IsOneWay属性设置为true来实现的
例如:[OperationContract(IsOneWay=true)]//单向模式
②编写客户端代码

8.3.3双工通信

1.双工(Duplex)是指客户端和服务端都可以主动呼叫对方。在这种通信模式中,WCF利用双向绑定实现服务端和客户端相互公开终结点的信息。
2.双工通信的主要设计思想:
①配置服务端绑定让其支持双工
在Web.config中的ProtocolMapping节点添加支持
②在服务端声明和实现接口
一个接口用于服务(客户端调用、服务端实现)
一个接口用于回调(服务端调用、客户端实现)
③在客户端实现回调接口
3.双工通信实现步骤
①修改服务端配置,选择合适的绑定方式

<protocolMapping>
	<add binding="wsDualHttpBinding" scheme="http"/>
</protocolMapping>

②在服务端声明和实现接口
双工通信由两个接口组成,第一个接口用于服务,第二个接口用于回调。两个接口中声明的方法不一定存在关联。或者说,可以有关联,也可以没有关联。
例:

[ServiceContract(SessionMode=SessionMode.Required,
CallbackContract=typeof(IService1DuplexCallback))]
public interface IService1Duplex{...}//服务接口
public interface IService1DuplexCallback{...}//回调接口

服务接口在服务端实现
如果在服务端要调用回调接口向客户端发送信息,先要创建回调通道。之后通过回调通道调用客户端接口方法,例如:

public class Service1:IService1Duplex{
...
IStudentsDuplexCallback Callback=OperationContext.Current.GetCallbackChannel<IStudentsDuplexCallback>();
}

③在客户端实现回调接口
在客户端实现中,必须有一个类实现服务端定义的双工协定回调接口,以便服务端利用它主动向该客户端发送信息。
由于服务端是通过客户端对象调用客户端的回调操作来实现与客户端的通信的,因此,在客户端编写和服务端通信的代码时,首先需要创建InstanceContext类的一个实例,以便让服务端通过该实例知道通信的是哪个客户端对象。
例:

InstanceContext site =new InstanceContext(this);
Service1DuplexClient client=new Service1DuplexClient(site);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

so.far_away

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值