1. 程式人生 > >(WCF初體驗)WCF伺服器診斷

(WCF初體驗)WCF伺服器診斷

      WCF伺服器搭建好之後,不管是客戶端訪問還是本地除錯,出個問題丟擲來的原因往往在我們看來都是不知所以然的,更可能是跑出來的問題和真正的問題差了很遠,比如“通訊物件 System.ServiceModel.ServiceHost 無法用於通訊,因為其處於“出錯”狀態。”這種錯誤就會有各種各樣的原因所以這時候就必須用到WCF伺服器的診斷功能了。

     而要實現伺服器的診斷功能,我們一般就是用伺服器跟蹤器來生成日誌檔案,然後檢視日誌檔案來根據我們呼叫服務時,伺服器所出現的問題。 要開啟這項功能需要配置WCF伺服器,如下面程式碼所示,主要包括診斷的定義和開啟診斷。

<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:12px;"><system.diagnostics>
        <sources>
            <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
                <listeners>
                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                    </add>
                    <add name="ServiceModelMessageLoggingListener">
                        <filter type="" />
                    </add>
                </listeners>
            </source>
            <source propagateActivity="true" name="System.ServiceModel" switchValue="Warning,ActivityTracing">
                <listeners>
                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                    </add>
                    <add name="ServiceModelTraceListener">
                        <filter type="" />
                    </add>
                </listeners>
            </source>
        </sources>
        <sharedListeners>
            <add initializeData="D:\WCFLog\web_messages.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
                <filter type="" />
            </add>
            <add initializeData="D:\WCFLog\web_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
                <filter type="" />
            </add>
        </sharedListeners>
        <trace autoflush="false" />
    </system.diagnostics></span></span>
<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:12px;"> <diagnostics>
      <messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true"
        logMessagesAtTransportLevel="true" />
    </diagnostics></span></span>

 對於初學者我建議的是用WCF編輯器來自己配置而不是直接複製配置檔案的程式碼。右鍵你的config檔案 選擇“編輯WCF配置”


如圖,把訊息日誌和跟蹤都選擇啟動



然後就是配置偵聽器的InitData,也是就日誌檔案儲存的地方。(這裡注意一下,如果你通過直接改配置來修改這個地址,請保證地址上的資料夾要存在),把兩個偵聽器的InitData都配置好。



最後儲存在啟動服務,當訪問服務的時候就會在你指定的位置生成web_messages.svclog 和web_tracelog.svclog兩個檔案,用TraceView開啟web_tracelog.svclog,詳細列出了你所有訪問的開啟,操作和結束。當然會有高亮的顏色顯示警告和錯誤,點選這條記錄會在右邊顯示詳細資訊和提示資訊。這樣就可以看到導致異常的真正原因。



注: 當用WCF編輯器配置診斷的時候,可能他會生成如下的程式碼,請將中文的警告改成Warning。

<span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:12px;"> <sources>
            <source name="System.ServiceModel.MessageLogging" switchValue="警告,ActivityTracing"></span></span>