1. 程式人生 > >Remoting異常處理:在客戶端獲取伺服器內部錯誤

Remoting異常處理:在客戶端獲取伺服器內部錯誤

用Remoting技術進行開發有些日子了,其中有個問題一直困擾著我,那就是有關在客戶端獲取伺服器內部錯誤的問題。當伺服器和客戶端部署在同一臺機器上時,伺服器端的錯誤能夠在客戶端成功地捕獲。但是,一旦當伺服器端和客戶端被部署到兩臺不同的機器上時,在客戶端只能捕獲到一個通用的異常:

System.Runtime.Remoting.RemotingException :伺服器遇到內部錯誤......

這樣籠統的錯誤提示,對於客戶端分析錯誤原因,顯然沒有什麼幫助。我按照錯誤提示,修改了伺服器端的配置檔案資訊,可是在客戶端仍然捕獲不到伺服器內部異常的詳細資訊。無奈之餘,我只好在伺服器端添加了一個錯誤日誌檔案,把遠端物件在伺服器端的異常寫到這個日誌檔案裡。客戶端出現異常時,登入伺服器檢視日誌。雖然這樣對於分析異常,查詢錯誤有所幫助,但是操作不便。

前天在給公司其它部門的人員做培訓,講一些有關Remoting的基礎知識時,突然想起自己以前那個專案中可能犯了一個錯誤。

以前的那個專案中,我用windows服務做Remoting的伺服器端宿主。通過一個服務框架,來管理註冊到伺服器端的Remoting服務。在每個服務註冊到伺服器端時,我用的是程式碼註冊的方式,而不是配置檔案的方式。這樣,雖然我在伺服器加了一個.config檔案,也配置了:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  
<system.runtime.remoting>
    
<
customErrors mode="off"/>
  
</system.runtime.remoting>
</configuration>

在客戶端卻依然獲取不到伺服器端的內部錯誤。解決這個問題的方法是,在伺服器端新增兩行程式碼:

//遠端丟擲錯誤
RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
RemotingConfiguration.CustomErrorsEnabled(
false);

經測試,問題解決了。

總結一下:在客戶端獲取伺服器端內部錯誤的方法有兩種,各有自己的適用情況。

1、當在伺服器端通過配置檔案實現服務註冊時,即

RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);

時,則在配置檔案中<system.runtime.remoting>加入<customErrors mode="off"/>即可實現。

2、當在伺服器端通過程式碼實現服務註冊時,即類似

RemotingConfiguration.RegisterWellKnownServiceType
                    (
                    
typeof(RemotingAdminObject),
                    
"RemotingAdmin",
                    WellKnownObjectMode.Singleton
                    );

時,則要通過以下的程式碼實現:

//遠端丟擲錯誤
RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off;
RemotingConfiguration.CustomErrorsEnabled(
false);