程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 我的WCF之旅(9):如何在WCF中使用tcpTrace來進行Soap Trace

我的WCF之旅(9):如何在WCF中使用tcpTrace來進行Soap Trace

編輯:關於.NET

無論對於Web Service還是WCF,Client和Service之間交互的唯一形式是通過發送和接收Soap Message。在我們對Web Service和WCF進行深入學習的時候,借助一些Soap Trace 工具對Soap Message進行深入剖析是非常有必要的。在這些工具之中,我覺得最好用的就是Microsoft Soap Toolkit中的Soap Trace Utility和tcpTrace。我們今天就來講講如何在WCF中使用tcpTrace這個工具。

首先我們來講講tcpTrace實現的基本原理。說的簡單點TcpTrace就是一個監聽/轉發器(Listening/Forwarding)。當我們啟動這個工具的時候,通過設置它監聽的Port,和它將要轉發的Host和Port(Destination Server& Destination Port),隨後它就開始在本機的Listening Port開始監聽,如果這時候一個針對該Listening Port 的Http Request,它就會把Request的內容取下來展現在我們的面前,隨後將該Request轉發到我們預先設定的Host和Port。

對於WCF來說,如果Client要訪問Service,一般情況下交互的只有Client和Service,Soap Message直接從Client到Service。但是在某些情況,我們需要在Client和Service之間加入一些額外的節點,我們把這些額外的節點Intermediary Node。我們可以通過這些Intermediary Node實現一些額外的功能,比如把不同的Request forward到不同的Server從而實現負載平衡(Load Balance)。按照面向服務的原則,服務具有高度的自治性(Automation),Soap Message一旦被Service發送出去,就不能再被該Service所控制,所以Soap來說,它需要具有高度的自描述性(Self-Describing),它自身必須包含所有必須的控制信息來指導任何接收到該Soap的節點如何去處理它。SOAP的無限擴展的Header在實現此功能上可謂功不可沒,原則上任何控制信息都可以放在Soap Header之中,Header的可擴展性也使一系列的WS-* Specification的實現 成為可能。對於每次的Message Exchange來說,尋址(Addressing)是首先需要解決的問題,在Intermediary Node的場景中,實際上涉及到兩個Address,其中一個是最終Service Endpoint的Address,另一個則是實際接收該Soap的Intermediary Node的Address。在WCF中通過ClientViaBehavior實現這樣的功能,我將在 後面講到。而我們今天所介紹的通過tcpTrace來獲取Soap的情況下,tcpTrace實際是就是充當了Intermediary Node的角色。

我們現在就來介紹如果使用tcpTrace。

假設我們在Local host有一個Calculator Service, Endpoint的Address的Uri為:http://localhost:8888/Calculator(Port為8888)。為了使大家有一個具體的認識,我給出了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具有下面一段對應的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>

上面實際上是Client直接和Service進行交互的方式。現在我們需要做的是,先把Soap發送給tcpTrace,tcpTrace進行Soap trace之後再把Soap Message傳到真正的Service。就需要一個特殊的Client端的Endpoint Behavior:ClientViaBehavior。假設tcpTrace進行監聽的Port為8080,那麼Client實現了ClientViaBehavior的configuration將會是如下的樣子:

<?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>

我們現在就可以來進行Soap Trace了,現在我們啟動tcpTrace。進行如下的設置,Destination Server和Destination Port為Service Endpoint對應的Host和Port。我們甚至還可以通過Log文件把Trace保存起來。

然後先後運行Service和Client,你將會在tcpTrace上看到他所截獲的Request和Response的內容:

而且相應的內容被記錄到我們指定的Log文件中:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved