使用Fiddler分析WCF处理通信请求
分布式开发中有一个基本的元素组成,就是通过简单对象访问协议(soap)来解决远程的对象传输问题,可以将一个对象序列成XML形式来传递,形如:
[DataContract] public class Person { [DataMember] public string Name { get; set; } [DataMember] public int Age { get; set; } }
这种对象呢,会在传输时被WCF标记为XML数据,因为XML可以被广泛的使用,几乎所有平台都认可这种数据格式,所以在WCF中这个对象可能会被标记为
<Person>
<Name>MyName</Name>
<Age>25</Age>
</Person>
这样到WCF的调用方之后就可以很方便的被认出来了,那么同样道理,类和类中的方法,属性等都会被有标准的序列化,一个标准的SOAP数据请求包呢,通常是这样的:
<soap:Envelope
xmlns:soap="http://www./2001/12/soap-envelope"
soap:encodingStyle="http://www./2001/12/soap-encoding">
<soap:Header>
…
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
就是通过这种方式,数据得以传递,请求能够获取数据,我们尝试用Fiddler来了解这其中的原理。
首先我们建立一个简单的WCF Service Application
这个工程中有个服务AddService.svc,其中有个方法是调用方传递一个Person实体到服务,服务改写实体属性后返回给客户端。这个过程是个典型的数据编辑交互的例子。
我们在本项目中引用AddService.svc服务,并添加一个UpdataPerson.aspx页面做测试用
这个页面的代码非常简单就是调用服务,传递一个实体进去,将获取到的实体对象的Age属性输出。
先来看看是否能够正常调用
下面我们通过Fiddler来监控这个过程。使用Fiddler时,需要将所使用的服务地址localhost后面加上.即:
更改完成之后,我们刷新一下刚才的页面,会发现在Fiddler中发现了这个请求
OK,我们这时就可以通过Fiddler截获的数据包分析整个调用过程了,注意Inspectors中的内容,是监控得到的信息
我们注意到Fiddler捕获到的信息包括很多有http header等,我们关注的是Raw中的内容
这里面包含了Http请求头和请求包含的数据内容
我们将<s:Envelope>提取出来发现这个就是WCF的请求格式
<s:Body>
<GetPerson xmlns="http://tempuri.org/%22>
<person xmlns:a="http://schemas.datacontract.org/2004/07/WCFServiceDemo%22 xmlns:i="http://www.w3.org/2001/XMLSchema-instance%22>
<a:Age>23</a:Age>
<a:Name>LeonWeng</a:Name>
</person>
</GetPerson>
</s:Body>
</s:Envelope>
我们发现这个“信封”中含有WCF请求所需的信息,包括服务的名称,Person实体的两个字段,那么有了这个XML文件之后呢,WCF服务器端便可以构造出Person类了:
然后再将这个类的属性改变一下,回送给客户端:
在这个Raw中,我们同样可以发现一个信封:
<s:Body>
<GetPersonResponse xmlns="http://tempuri.org/%22>
<GetPersonResult xmlns:a="http://schemas.datacontract.org/2004/07/WCFServiceDemo%22 xmlns:i="http://www.w3.org/2001/XMLSchema-instance%22>
<a:Age>25</a:Age>
<a:Name>LeonWeng</a:Name>
</GetPersonResult>
</GetPersonResponse>
</s:Body>
</s:Envelope>
23已经被服务端修改成了25,不同的是标记改变了成了输出:
下面的一篇,我们将通过Fiddler了解更多的内容。