說點題外話,我們在玩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,比如下面這樣,一目瞭然,你懂的。。。