使用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数据请求包呢,通常是这样的:

代码
<?xml version="1.0"?> 
<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

image

这个工程中有个服务AddService.svc,其中有个方法是调用方传递一个Person实体到服务,服务改写实体属性后返回给客户端。这个过程是个典型的数据编辑交互的例子。

image

我们在本项目中引用AddService.svc服务,并添加一个UpdataPerson.aspx页面做测试用

image

这个页面的代码非常简单就是调用服务,传递一个实体进去,将获取到的实体对象的Age属性输出。

image

先来看看是否能够正常调用

image

下面我们通过Fiddler来监控这个过程。使用Fiddler时,需要将所使用的服务地址localhost后面加上.即:

imageimage

更改完成之后,我们刷新一下刚才的页面,会发现在Fiddler中发现了这个请求

image

OK,我们这时就可以通过Fiddler截获的数据包分析整个调用过程了,注意Inspectors中的内容,是监控得到的信息

image

我们注意到Fiddler捕获到的信息包括很多有http header等,我们关注的是Raw中的内容

image

这里面包含了Http请求头和请求包含的数据内容

我们将<s:Envelope>提取出来发现这个就是WCF的请求格式

代码
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/%22>
<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类了:

Person person=new Person(){Name=”LeonWeng”,Age=23};

然后再将这个类的属性改变一下,回送给客户端:

image

在这个Raw中,我们同样可以发现一个信封:

代码
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/%22>
<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,不同的是标记改变了成了输出:

image

下面的一篇,我们将通过Fiddler了解更多的内容。

posted @ 2010-12-27 20:30 翁玉礼 阅读(...) 评论(...) 编辑 收藏