2013-05-08 56 views
1

在使用Enterprise Library 6的異常處理應用程序塊時,如何將異常的附加屬性映射到自定義錯誤協定?在企業庫6中爲WCF配置故障合同異常處理程序

This article描述了FaultContractPropertyMapping的相同方法this one does。如果您有這樣的錯誤合同:

[DataContract] 
public class SalaryCalculationFault 
{ 
    [DataMember] 
    public Guid FaultID { get; set; } 

    [DataMember] 
    public string FaultMessage { get; set; } 
} 

如何添加另一個屬性並將其映射到原始異常?比方說,我想用一個新的屬性,以顯示存儲過程的名稱到客戶端:

[DataMember] 
public string StoredProcedureName { get; set; } 

我嘗試編輯的第90頁上顯示「開發人員指南,以微軟企業庫,Preview.pdf」 which can be found here的映射,但它似乎沒有工作。我的新映射如下所示:

var mappings = new NameValueCollection(); 
mappings.Add("FaultID", "{Guid}"); 
mappings.Add("FaultMessage", "{Message}"); 
mappings.Add("StoredProcedureName", "{Procedure}"); //SqlException has a Procedure property 

這裏是政策。

var testPolicy = new List<ExceptionPolicyEntry> 
{ 
    { 
     new ExceptionPolicyEntry(typeof(SqlException), 
      PostHandlingAction.ThrowNewException, 
      new IExceptionHandler[] 
      { 
       new FaultContractExceptionHandler(typeof(SalaryCalculationFault), mappings) 
      }) 
    } 
}; 

var policies = new List<ExceptionPolicyDefinition>(); 
policies.Add(new ExceptionPolicyDefinition(
    "TestPolicy", testPolicy)); 

exManager = new ExceptionManager(policies); 
ExceptionPolicy.Reset(); 
ExceptionPolicy.SetExceptionManager(exManager); 

當我這樣做並捕獲客戶端上的FaultException並檢查它時,StoredProcedureName始終爲空。爲什麼它不是從SqlException映射到我的錯誤異常中的新屬性?

+0

也許我錯過了一些東西,但是您會將StoredProcedureName添加到您的故障合同中。 – 2013-05-08 21:45:26

+0

是的,我的OP顯示我添加了一個公共字符串StoredProcedureName DataMember到DataContract。 – BBauer42 2013-05-09 01:28:05

回答

0

事實證明,實際上你不應該在ExceptionManager.Processs()方法中放置你期望出現異常的代碼。我之前是這樣做的:

exManager.Process(() => wimDAL.Execute_NonQueryNoReturn(sc), "TestPolicy"); 

Insead,只是像正常一樣執行代碼。

wimDAL.Execute_NonQueryNoReturn(sc); 

這並不關注你的「開發人員指南,以微軟企業庫,Preview.pdf說:」但我想的文檔仍處於進展中的工作。我希望這可以幫助別人。