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就能在网络或者远程终端传输对象了。

时间: 2024-09-30 06:37:08

WCF服务调用与普通HTTP请求区别的相关文章

WCF系列之WCF服务调用方式

WCF服务调用通过两种常用的方式:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式,一种是通过ChannelFactory直接创建服务代理对象进行服务调用. 通过SvcUtil.exe的方式调用服务 SvcUtil.exe是一个命令行工具,位于:C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin目录下,可以将SvcUtil.exe添加到VS2010中方便以后的运用,添加方式:在VS2010的Tools菜单中选择External T

WCF 服务调用 QueryRun

通过AX2012的WCF服务调用AX2012的方法时,如果方法里调用了QueryRun对象时,会报错,报错信息如下:System.ServiceModel.FaultException: 无法将类型为“Dynamics.Ax.Application.QueryRun”的对象强制转换为类型“Dynamics.Ax.Application.SysQueryRun”. Server stack trace: 在 System.ServiceModel.Channels.ServiceChannel.H

记录:Web无引用无配置方式动态调用WCF服务

这几年一直用WebApi较多,最近项目中有个需求比较适合使用WCF,以前也用过JQuery直接调用Wcf的,但是说实话真的忘了… 所以这次解决完还是花几分钟记录一下 WCF服务端:宿主在现有Win服务中,在服务启动时添加代码 ,服务代码就不用写了,接口和实现按照契约实现即可 private ServiceHost serviceHost = null; //服务宿主 //启动WCF服务 if (serviceHost != null) { serviceHost.Close(); } servi

WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ

之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识(1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的基础文章.在那篇文章里,我们详细介绍了MSMQ消息队列的基本概念.安装.部署.开发.调试等相关问题.今天我们来学习WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ.在WCF框架下使用MSMQ消息队列服务编程.  这里我会给出一个使用WCF MSMQ实现离线请求的DEMO示例程序. 全文结构是:[1]MSMQ基本概念[2]W

使用svctraceviewer查看WCF服务异常信息

这两天遇到一个问题,调用一个WCF服务的时候,服务器端正常的返回了数据,但是客户端却遇到了一场 System.ServiceModel.CommunicationException: The underlying connection was closed: The connection was closed unexpectedly. 直接调试查看堆栈信息也没有弄清楚怎么回事.最后上网搜了一下,发现一个获取WCF运行信息的工具. 1.打开服务器端wcf服务的web.config配置文件并添加如

实现在GET请求下调用WCF服务时传递对象(复合类型)参数

WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法>.<实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法>,在此就不作重述. 实现WCF支持HTTP请求调用容易,但要实现类似MVC的ACTION及WEB API那样的灵活,那就得花费点功夫,为什么这样说

Android基于ksoap2调用WCF服务(二):Android篇

上一篇通过一个非常简单的例子,完成了一个WCF的服务.接下来介绍一下Android端. Android端调用WCF,采用基于ksoap2包来实现. 下载地址(这个需要fan qiang访问,你们懂的):https://code.google.com/p/ksoap2-android/ 我用的3.3.0版本,我传到csdn上,上面地址如果不能访问,可以用这个地址:http://download.csdn.net/detail/cnryc/7695437 程序的源代码下载地址:http://down

搭建基于asp.net的wcf服务,ios客户端调用的实现记录

一.写wcf 问题: 1.特定的格式 2.数据绑定 3.加密解密 二.发布到iis 问题: 1.访问权限问题,添加everyone权限 访问网站时:http://localhost/WebbUploadSample/ZipUpload.aspx “/WebbUploadSample”应用程序中的服务器错误. -------------------------------------------------------------------------------- 访问被拒绝. 说明: 访问服

jQuery调用WCF服务传递JSON对象

下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web Service,而不去使用ASP.Net AJAX库,至于为什么不使用AJAX库中,那是因为我们在项目中已经使用了jQuery,而它已经能处理全部的AJAX请求和所有功能,并且,如果我们 一旦使用ASP.NET AJAX库,我们也必须多包含一个超过80Kb的数据量(调试模式下会更大),但这也不是说