Remoting異常處理:在客戶端獲取伺服器內部錯誤
用Remoting技術進行開發有些日子了,其中有個問題一直困擾著我,那就是有關在客戶端獲取伺服器內部錯誤的問題。當伺服器和客戶端部署在同一臺機器上時,伺服器端的錯誤能夠在客戶端成功地捕獲。但是,一旦當伺服器端和客戶端被部署到兩臺不同的機器上時,在客戶端只能捕獲到一個通用的異常:
System.Runtime.Remoting.RemotingException :伺服器遇到內部錯誤......
這樣籠統的錯誤提示,對於客戶端分析錯誤原因,顯然沒有什麼幫助。我按照錯誤提示,修改了伺服器端的配置檔案資訊,可是在客戶端仍然捕獲不到伺服器內部異常的詳細資訊。無奈之餘,我只好在伺服器端添加了一個錯誤日誌檔案,把遠端物件在伺服器端的異常寫到這個日誌檔案裡。客戶端出現異常時,登入伺服器檢視日誌。雖然這樣對於分析異常,查詢錯誤有所幫助,但是操作不便。
前天在給公司其它部門的人員做培訓,講一些有關Remoting的基礎知識時,突然想起自己以前那個專案中可能犯了一個錯誤。
以前的那個專案中,我用windows服務做Remoting的伺服器端宿主。通過一個服務框架,來管理註冊到伺服器端的Remoting服務。在每個服務註冊到伺服器端時,我用的是程式碼註冊的方式,而不是配置檔案的方式。這樣,雖然我在伺服器加了一個.config檔案,也配置了:
<?xml version="1.0" encoding="utf-8"?><configuration>
<system.runtime.remoting>
<
</system.runtime.remoting>
</configuration>
在客戶端卻依然獲取不到伺服器端的內部錯誤。解決這個問題的方法是,在伺服器端新增兩行程式碼:
//遠端丟擲錯誤RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
RemotingConfiguration.CustomErrorsEnabled(false);
經測試,問題解決了。
總結一下:在客戶端獲取伺服器端內部錯誤的方法有兩種,各有自己的適用情況。
1、當在伺服器端通過配置檔案實現服務註冊時,即
時,則在配置檔案中<system.runtime.remoting>下加入<customErrors mode="off"/>即可實現。
2、當在伺服器端通過程式碼實現服務註冊時,即類似
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(RemotingAdminObject),
"RemotingAdmin",
WellKnownObjectMode.Singleton
);
時,則要通過以下的程式碼實現:
//遠端丟擲錯誤RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
RemotingConfiguration.CustomErrorsEnabled(false);