十五天精通WCF——第十一天 如何對wcf進行全程監控

一線碼農發表於2015-07-15

  說點題外話,我們在玩asp.net的時候,都知道有一個叼毛玩意叫做“生命週期”,我們可以用httpmodule在先於頁面的page_load中

做一些攔截,這樣做的好處有很多,比如記錄日誌,引數過濾,全域性登入驗證等等。。。在wcf裡面的話也是有類似的功能,第一種就是在

endpoint中加上runtime的behavior,這樣的話就可以先於“服務方法”做攔截,第二種方法呢,也就是我們這一篇所說的全程監控,俗稱

”診斷功能”。

 

一:診斷

  我也說了,“診斷”這是wcf的一個專業術語,意思也就是監控wcf的所有動向,如果往下說的話,可以分為監控 wcf的message 和 wcf

本身的服務狀態資訊和端對端的流轉訊息。

1. 端對端的流轉訊息

  在玩wcf之前,不知道有多少人熟悉Diagnostics,對的,它就是.net自帶的日誌類,當然在這個年代,記錄日誌的元件有很多,比如

log4net,Nlog等等。。。不過話說回來,Diagnostics這個叼毛用起來還比較另類,它由“跟蹤源” 和 “監聽器”組成。分別就是TraceSource

來指定跟蹤源,用TraceListener來指定跟蹤源的監聽器,所以理所當然,TraceSource的所有蹤跡都會被TraceListener監聽到,下面我們

看看怎麼玩。

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="ActivityTracing">
        <listeners>
          <add name="mylisteners" type="System.Diagnostics.XmlWriterTraceListener" initializeData="E:\1.txt" />
        </listeners>
      </source>
    </sources>
    <trace autoflush="true"/>
  </system.diagnostics>

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service name="MyService.HomeService">
        <endpoint address="HomeService" binding="wsHttpBinding"
          contract="MyService.IHomeService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://192.168.1.107:1920" />
          </baseAddresses>
        </host>
      </service>
    </services>

  </system.serviceModel>

</configuration>

 從上面的配置中可以看到,你有沒有發現我在配置system.diagnostics的時候和wcf一點關係都沒有,我並沒有在system.ServiceModel

下對diagnostics有一丁點的配置,對吧,這說明什麼,說明“蹤跡跟蹤”功能和wcf一點關係都沒有,但卻可以完整的記錄wcf的蹤跡資訊,然

後我稍微解釋下listeners節點,在這裡我配置了一個XmlWriterTraceListener的監聽器,然後把輸出檔案的路徑配置在initializeData屬性下,

其實都是diagnostics本身的知識範疇,和wcf一點關係都沒有,好了,下面我開啟下程式,看看到底都追蹤到什麼?

有沒有看到,當我的服務啟動之後,追蹤資訊就全部來了。。。但是接下來有一個問題來了,這個很雜亂的xml該怎麼看才能最舒舒服服的

呢???不用著急啦,wcf同樣給我們提供了一個叫做SvcTraceView的工具,專門就是用來查詢這個“蹤跡資訊”的,工具的路徑在:

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools

 

下面的事情就是開啟它,附加一下1.txt檔案就好了,如下圖:

從左邊的“活動圖”中大概可以看到HomeService這個服務啟動到執行經歷了一些什麼樣的悲慘故事。。。有興趣的話,大家可以自己動

手試試啦。

 

2. 監控input和ouput的message

  如果要監控message的話,我們需要再定義一個TraceSource 和 TraceListener即可,不過這次監聽的是System.ServiceModel.

MessageLogging跟蹤源,然後在System.ServiceModel下面配置一下message的引數,如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3 
 4   <system.diagnostics>
 5     <sources>
 6       <source name="System.ServiceModel" switchValue="ActivityTracing">
 7         <listeners>
 8           <add name="mylisteners" type="System.Diagnostics.XmlWriterTraceListener" initializeData="E:\1.txt" />
 9         </listeners>
10       </source>
11       <source name="System.ServiceModel.MessageLogging" switchValue="ActivityTracing">
12         <listeners>
13           <add name="messagelogging" type="System.Diagnostics.XmlWriterTraceListener" initializeData="E:\2.txt"/>
14         </listeners>
15       </source>
16     </sources>
17     <trace autoflush="true"/>
18   </system.diagnostics>
19 
20   <system.serviceModel>
21 
22     <diagnostics>
23       <messageLogging logEntireMessage="true" logMalformedMessages="true"  logMessagesAtTransportLevel="true" />
24     </diagnostics>
25 
26     <behaviors>
27       <serviceBehaviors>
28         <behavior>
29           <serviceMetadata httpGetEnabled="true" />
30           <serviceDebug includeExceptionDetailInFaults="false" />
31         </behavior>
32       </serviceBehaviors>
33     </behaviors>
34 
35     <services>
36       <service name="MyService.HomeService">
37         <endpoint address="HomeService" binding="basicHttpBinding"
38           contract="MyService.IHomeService">
39           <identity>
40             <dns value="localhost" />
41           </identity>
42         </endpoint>
43         <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
44         <host>
45           <baseAddresses>
46             <add baseAddress="http://192.168.1.107:1920" />
47           </baseAddresses>
48         </host>
49       </service>
50     </services>
51 
52   </system.serviceModel>
53 
54 </configuration>

 

這次我準備來跑一下客戶端,呼叫Server端的Update方法,看看能抓到啥樣的Messsage。

 

 

現在我迫不及待的想用SvcTraceView開啟下2.txt,看看都拿到了什麼追蹤資訊。。。

 

 

好了,這篇我也只是引路式的介紹下SvcTraceView,具體更深入的玩法,大家可以琢磨琢磨,對了,如果大家想對Source和Listener的

一些引數需要進一步瞭解,可以參考下SvcConfigEditor,比如下面這樣,一目瞭然,你懂的。。。

 

相關文章