你的位置:首页 > ASP.net教程

[ASP.net教程]WCF服务调用与普通HTTP请求区别


用WCF技术也有一段时间了,只知道引用服务地址后调用里面的方法就行了。之前也没有思考wcf里面的一些东西,现在才对WCF里的一些产生疑惑,比如,为什么会有代理类,为什么要有绑定,信道又是干啥用的。

今天结合传统的浏览器请求讲讲我个人的见解,至于WCF的基本技术点,什么信道,ChannelFactory,ClientBase之类的我就不管了。

由于技术有限,不对的地方欢迎批评。

那我们就传统浏览器的例子解释WCF里的一些技术名词(WCF服务以IIS为宿主环境)

 

信道

当们我在浏览器里输入地址,按下回车键后,就能得到我们想要看到的内容。

其实当我们按下回车的那一瞬间,浏览器帮我们做了很多工作,

如:与服务器建立连接,对发送的内容进行编码,对数据进行传输等,这些步骤对应WCF里的信道,信道的作用正是通信的通道,

信道可不只有一个,最重要的有编码信道,传输信道,正是这些信道解决两个端点数据发送/接收和问题。

 

在普通浏览器请求中,信道是由浏览器建立出来的,而在WCF中,信息是被System.ServiceModel 这个组件建立的。所以我们使用WCF时必须要引用这个组件

 

地址

WCF的地址与浏览器的地址一样,有了地址我们才知道我们要请求的服务在哪里。

 

绑定

如果我们用监听软件监听HTTP请求,如Fiddler很容易发现请求的时候有这样的信息:

 

这些信息在HTTP 请求里叫请求头或者响应头,它解决了客户端和服务端用什么编码规则,是什么数据类型,数据大小等规定。

在WCF里类似的这样的规定叫“绑定”,

 

如:在反编译器中给绑定对象赋值的CloseTimeOut,SendTimeOut是否很熟悉,webconfig里绑定配置里就有设置相关的内容。当然WCF的绑定比浏览器的功能更强大。

 

代理类

先说说序列化,客户端和服务要传递的对象一定要是能序列化的,因为序列化后对象才能在网络中传输,我们知道网络传输最终的形式是比特流,而序列化正是把数据对象弄成比特流。

 

当们引用服务地址后(也可能用生成工具生成代理类),我们可以发现在Reference.cs里看到和服务端提供服务的类里的代码非常像。这个文件是实实在在的存在我们本地文件夹里的,那这个文件就是我们VS,或者生成工具根据服务提供的元数据信息在我们本地生成的一个这样的类。

 

那这个类的作用就是为我们本地代码服务的,

首先里面的实体数据类,我可以new出实体对象与服务端进行数据传递,如参数对象等。

接着是操作类,就是后面带有Client的类,当我们调用这个类里的方法的时候,信道就被创建出来了,信道出来后就能调用到服务端的方法了,也就完成了远程调用了,得到了服务器返回给我们的结果。

 

既然WCF调用(IIS宿主环境),与浏览器请求本质是一样的东西,为什么不能在浏览器里输入服务地址得到处理结果呢。

因为WCF用的是SOAP协议,SOAP协议也是基于HTTP协议的,但是浏览器根本就不能处理SOAP的数据。

 

契约

声明哪些函数和类可以让客户端使用

 

所以WCF最主要的功能可以看成两点:封装了一整套网络通信的功能,本质上用的还是TCP/IP,Socket,Http那一套东西。二是数据的序列化以及反列化,配合SOAP就能在网络或者远程终端传输对象了。