我的WCF之旅(9):如何在WCF中使用tcpTrace來進(jìn)行Soap Trace
首先我們來講講tcpTrace實(shí)現(xiàn)的基本原理。說的簡單點(diǎn)TcpTrace就是一個(gè)監(jiān)聽/轉(zhuǎn)發(fā)器(Listening/Forwarding)。當(dāng)我們啟動(dòng)這個(gè)工具的時(shí)候,通過設(shè)置它監(jiān)聽的Port,和它將要轉(zhuǎn)發(fā)的Host和Port(Destination Server& Destination Port),隨后它就開始在本機(jī)的Listening Port開始監(jiān)聽,如果這時(shí)候一個(gè)針對(duì)該Listening Port 的Http Request,它就會(huì)把Request的內(nèi)容取下來展現(xiàn)在我們的面前,隨后將該Request轉(zhuǎn)發(fā)到我們預(yù)先設(shè)定的Host和Port。
對(duì)于WCF來說,如果Client要訪問Service,一般情況下交互的只有Client和Service,Soap Message直接從Client到Service。但是在某些情況,我們需要在Client和Service之間加入一些額外的節(jié)點(diǎn),我們把這些額外的節(jié)點(diǎn)Intermediary Node。我們可以通過這些Intermediary Node實(shí)現(xiàn)一些額外的功能,比如把不同的Request forward到不同的Server從而實(shí)現(xiàn)負(fù)載平衡(Load Balance)。按照面向服務(wù)的原則,服務(wù)具有高度的自治性(Automation),Soap Message一旦被Service發(fā)送出去,就不能再被該Service所控制,所以Soap來說,它需要具有高度的自描述性(Self-Describing),它自身必須包含所有必須的控制信息來指導(dǎo)任何接收到該Soap的節(jié)點(diǎn)如何去處理它。SOAP的無限擴(kuò)展的Header在實(shí)現(xiàn)此功能上可謂功不可沒,原則上任何控制信息都可以放在Soap Header之中,Header的可擴(kuò)展性也使一系列的WS-* Specification的實(shí)現(xiàn) 成為可能。對(duì)于每次的Message Exchange來說,尋址(Addressing)是首先需要解決的問題,在Intermediary Node的場景中,實(shí)際上涉及到兩個(gè)Address,其中一個(gè)是最終Service Endpoint的Address,另一個(gè)則是實(shí)際接收該Soap的Intermediary Node的Address。在WCF中通過ClientViaBehavior實(shí)現(xiàn)這樣的功能,我將在 后面講到。而我們今天所介紹的通過tcpTrace來獲取Soap的情況下,tcpTrace實(shí)際是就是充當(dāng)了Intermediary Node的角色。
我們現(xiàn)在就來介紹如果使用tcpTrace。
假設(shè)我們?cè)贚ocal host有一個(gè)Calculator Service, Endpoint的Address的Uri為:http://localhost:8888/Calculator(Port為8888)。為了使大家有一個(gè)具體的認(rèn)識(shí),我給出了Host該Service的configuration:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Artech.ExceptionHandling.Service.CalculatorService">
<endpoint binding="wsHttpBinding" contract="Artech.ExceptionHandling.Contract.ICalculator" address="http://localhost:8888/Calculator" />
</service>
</services>
</system.serviceModel>
</configuration>
在一般的情況下,Client具有下面一段對(duì)應(yīng)的Configuration(Port為8888)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address="http://localhost:8888/Calculator" binding="wsHttpBinding" contract="Artech.ExceptionHandling.Contract.ICalculator"
name="defualtEndpoint" />
</client>
</system.serviceModel>
</configuration>
上面實(shí)際上是Client直接和Service進(jìn)行交互的方式。現(xiàn)在我們需要做的是,先把Soap發(fā)送給tcpTrace,tcpTrace進(jìn)行Soap trace之后再把Soap Message傳到真正的Service。就需要一個(gè)特殊的Client端的Endpoint Behavior:ClientViaBehavior。假設(shè)tcpTrace進(jìn)行監(jiān)聽的Port為8080,那么Client實(shí)現(xiàn)了ClientViaBehavior的configuration將會(huì)是如下的樣子:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="calculatorEndpointBehavior">
<clientVia viaUri="http://localhost:8080/Calculator" />
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="http://localhost:8888/Calculator" behaviorConfiguration="calculatorEndpointBehavior"
binding="wsHttpBinding" contract="Artech.ExceptionHandling.Contract.ICalculator"
name="defualtEndpoint" />
</client>
</system.serviceModel>
</configuration>
我們現(xiàn)在就可以來進(jìn)行Soap Trace了,現(xiàn)在我們啟動(dòng)tcpTrace。進(jìn)行如下的設(shè)置,Destination Server和Destination Port為Service Endpoint對(duì)應(yīng)的Host和Port。我們甚至還可以通過Log文件把Trace保存起來。

然后先后運(yùn)行Service和Client,你將會(huì)在tcpTrace上看到他所截獲的Request和Response的內(nèi)容:

而且相應(yīng)的內(nèi)容被記錄到我們指定的Log文件中:
WCF相關(guān)內(nèi)容:
[原創(chuàng)]我的WCF之旅(1):創(chuàng)建一個(gè)簡單的WCF程序
[原創(chuàng)]我的WCF之旅(2):Endpoint Overview
[原創(chuàng)]我的WCF之旅(3):在WCF中實(shí)現(xiàn)雙向通信(Bi-directional
Communication)
[原創(chuàng)]我的WCF之旅(4):WCF中的序列化(Serialization)- Part I
[原創(chuàng)]我的WCF之旅(4):WCF中的序列化(Serialization)- Part II
[原創(chuàng)]我的WCF之旅(5):Service Contract中的重載(Overloading)
[原創(chuàng)]我的WCF之旅(6):在Winform Application中調(diào)用Duplex
Service出現(xiàn)TimeoutException的原因和解決方案
[原創(chuàng)]我的WCF之旅(7):面向服務(wù)架構(gòu)(SOA)和面向?qū)ο缶幊蹋∣OP)的結(jié)合——如何實(shí)現(xiàn)Service
Contract的繼承
[原創(chuàng)]我的WCF之旅(8):WCF中的Session和Instancing Management
[原創(chuàng)]我的WCF之旅(9):如何在WCF中使用tcpTrace來進(jìn)行Soap Trace
[原創(chuàng)]我的WCF之旅(10): 如何在WCF進(jìn)行Exception Handling
[原創(chuàng)]我的WCF之旅(11):再談WCF的雙向通訊-基于Http的雙向通訊 V.S.
基于TCP的雙向通訊
[原創(chuàng)]我的WCF之旅(12):使用MSMQ進(jìn)行Reliable Messaging
[原創(chuàng)]我的WCF之旅(13):創(chuàng)建基于MSMQ的Responsive Service


無論對(duì)于Web Service還是WCF,Client和Service之間交互的唯一形式是通過發(fā)送和接收Soap Message。在我們對(duì)Web Service和WCF進(jìn)行深入學(xué)習(xí)的時(shí)候,借助一些Soap Trace 工具對(duì)Soap Message進(jìn)行深入剖析是非常有必要的。在這些工具之中,我覺得最好用的就是Microsoft Soap Toolkit中的Soap Trace Utility和tcpTrace。我們今天就來講講如何在WCF中使用tcpTrace這個(gè)工具。
浙公網(wǎng)安備 33010602011771號(hào)