2011-07-12 19 views
2

私のwcfアプリケーションのグローバル例外処理をビルドしました。私は 'IErrorHandler'を実装し、例外を処理するクラスを持っています。 ErrorHandlerを 'IServiceBehavior'属性で登録できます。 (私はすべての関数に触れる必要はありません)WCFグローバル例外処理

クラス 'FaultException'を使用して例外オブジェクトをラップします。

Dim sysEx As SystemException = 'Do Convert 
Dim fex As New FaultException(Of SystemException)(sysEx, sysEx.Message) 
Dim faultMessage As MessageFault = fex.CreateMessageFault 
fault = System.ServiceModel.Channels.Message.CreateMessage(version, faultMessage, fex.Action) 

ここで、クライアント側でエラーメッセージを取得できます。しかし、残念ながら私は元の例外タイプまたは元のスタックトレースを取得できません。

サービスの各機能に「FaultContract」を追加することなく問題を解決する簡単な方法はありますか?

はあなた

答えて

1

スティーブ&サラバナンはどちらも正しいです。ここではそれを使用する方法をカスタム障害種別&を作成する方法である:

カスタム障害契約:

[DataContract] 
public class UncaughtErrorFault 
{ 
    [DataMember] 
    public string ExecptionType { get; set; } 

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

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

IErrorHandlerメソッドのオーバーライド:

public void ProvideFault(Exception error, 
         MessageVersion version, 
         ref Message fault) 
{ 
    var fe = new FaultException<UncaughtErrorFault>(
     new UncaughtErrorFault 
      { 
       ExecptionType = error.GetType().Name, 
       Message = error.Message, 
       StackTrace = error.StackTrace 
      }, 
     error.Message, 
     FaultCode.CreateReceiverFaultCode(
      new FaultCode(error.GetType().Name))); 

    var mf = fe.CreateMessageFault(); 

    fault = Message.CreateMessage(version, mf, fe.Action); 
} 
+0

多分私は自分自身を間違って表現しました。クラス "UncaughtErrorFault"をクライアント側に "公開"するにはどうすればよいですか?タイプは自動生成された「サービス参照」(もちろん)に追加されません。したがって、WCFはフォールトを「UncaughtErrorFault」オブジェクトではなく、通常のSystem.Exceptionに変換します。どうすればこの問題を解決できますか? – Mimefilt

+0

カスタムフォールトを公開するには、この[MSDN記事](http://msdn.microsoft.com/en-us/library/ms733841.aspx)を参照してください。カスタムOperation Typeを指定するFaultContract属性を使用してService OperationContractメソッドをマークする方法を示します。ただし、サービスリファレンスに必要なデシリアライズコードを含めるには、サービスの各オペレーションメソッドにマークを付ける必要があります。それが@SteveWilkesへの私のコメントで私が言及していたものでした –

1

FaultContractsを使用して、カスタムでFault種類WCFでの取り扱いの例外のthe recommended wayですFaultExceptionsを投げてありがとうございます。クライアント側でスタックトレースを取得する必要がある場合は、WCF動作設定でincludeExceptionDetailInFaultsをtrueに設定できます。

+0

残念ながらサービスは、通常の.NET例外を投げることができるし、通常の.NET例外もスローする「クローズドソース」の部分があります。したがって、.NETの例外をSOAPの障害に変換するために、共通で扱いやすい方法が必要です。この目的のために私は上記のコードを書いた。残念ながら、FaultContractをすべての関数に追加することなく、より多くのプロパティを含むカスタムフォールトを作成する方法はわかりません。 – Mimefilt

+0

WCFでそのカスタムフォールトをスローする場合を除き、操作メソッドにFaultContract属性を追加する必要はありません。カスタムフォールトが "埋め込まれている"ため、いつも標準のWCF FaultExceptionをキャッチすることができます。 FaultException型の拡張メソッドを記述して、提供するカスタム情報を抽出することができます。 –

0

IErrorHandler.ProvideFaultでは、最初のパラメータで例外が発生しています。カスタムFaultMessageでそれをラップすることができます。

IErrorHandler.ProvideFault(例外エラー、MessageVersionの版、REFメッセージ障害)

IErrorHandler Interfaceを参照してください。このページでは、この例外のラッピングを行う方法の例を示します。