2010-11-30 80 views
0

我有2個WCF服務和一個調用第一個WCF服務的方法的客戶端,該方法因此調用第二個WCF服務的方法。第二個WCF服務的方法引發了一個通用的錯誤異常,我需要這個異常通常會通過第一個服務「交付」給我的客戶。第一個WCF服務通常會在異常消息主體中獲取該通用異常,其中Action「http:// SomeNamespace」。當第一個服務重新拋出這個異常給客戶端時,客戶端變得簡單FaultException而不是動作`包含一個客戶端不能接受的名字空間,這就是爲什麼客戶端無法獲得一般的異常。在第一個WCF服務中有一個WCF異常屏蔽。以下是配置代碼和處理程序代碼。 請幫助我,並建議改變異常行爲的最佳方式,即客戶端能夠正常獲取它。修改例外

下面是配置:

<exceptionHandling> 
     <exceptionPolicies> 
     <add name="WCF Exception Shielding"> 
      <exceptionTypes> 
      <add type="System.ServiceModel.FaultException`1[[Sample.SomeFaultContract, Sample, PublicKeyToken=769e6b46280078d4]], System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
       postHandlingAction="ThrowNewException" name="SomeFaultContract"> 
       <exceptionHandlers> 
        <add faultContractType="Sample.SomeFaultContract, Sample, PublicKeyToken=769e6b46280078d4" 
        type="Helper.ServiceFaultContractHandler, Logger, PublicKeyToken=769e6b46280078d4" 
        name="Fault Contract Exception Handler" /> 
       </exceptionHandlers> 
      </add> 
      </exceptionTypes> 
     </add> 
    </exceptionHandling> 

而且處理的部分是:

public class ServiceFaultContractHandler : IExceptionHandler 
{ 
    public ServiceFaultContractHandler(NameValueCollection ignore) { } 

    public Exception HandleException(Exception exception, Guid correlationID) 
    { 


    }   
} 

預先感謝您。

亞蘭

回答

0

爲了得到異常的詳細信息,您應該設置includeExceptionDetailInFaults屬性爲true的服務行爲。
下面是一個示例:

<behaviors> 
    <serviceBehaviors> 
     <behavior name="WCFServicesName"> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 
+0

謝謝你的回答,但是這是在配置已設置。客戶端的合同有他自己的名字空間,並且它得到具有不同名字空間的異常,並且不能識別該異常。出於測試目的,我已經用excpetion的Action中的名稱空間更改了客戶端的名稱空間,並且工作順利。但不幸的是,我無法更改任何名稱空間,只能以某種方式處理第一個WCF服務中的異常,並使用正確的名稱空間將其發送給客戶端。 – Aram 2010-11-30 08:33:50