2016-04-22 3 views
0

私は非常に単純な3層プロジェクトを持っています。データストアと対話するDAL(データアクセスレイヤ)WCFサービスがあります。 DALサービスとクライアントUIとの間の仲介役としてのBLL(ビジネスロジックレイヤー)WCFサービス、およびWindowsフォームクライアントレイヤーです。中規模のサービスで強く型付けされたWCF FaultExceptionを返す

私は障害の契約として動作するように私のDALサービスでのDataContractを宣言:

[DataContract] 
public class ValidationFault 
{ 
    [DataMember] 
    public String Message { get; set; } 
    [DataMember] 
    public String PropertyName { get; set; } 
    ... 
} 

私のDALサービスがFaultContract属性で飾ら操作を持っています

[OperationContract] 
[FaultContract(typeof(ValidationFault))] 
Patient CreatePatient(Patient patient); 

CreatePatientの実装はスロー次のような厳密な型のFaultExceptionが発生します。

throw new FaultException<ValidationFault>(new ValidationFault("Patient last name cannot be empty.", "LastName")); 

BLLサービスは、DALサービスのクライアントとして機能し、UIレイヤのサービスとして機能します。私のBLLサービスでは、DALサービスのCreatePatientメソッドを呼び出します.FaultExceptionフォールトが発生した場合は、単にクライアントが処理するように再スローします。関連BLLコードは次のようになります。

... 
catch (FaultException<ValidationFault>) 
{ 
    throw; 
} 

私はBLLに例外を検査することができますし、それは強く型付けされたFaultExceptionとそのままDALから渡された詳細セクションであることを確認することができます。例外を再現しようとしているBLLメソッドは、上記のDALメソッドと同じ[FaultContract]属性で修飾されています。

BLLサービスのクライアントであるUIクライアントは、例外を処理し、適切な情報を記録/表示しようとします。問題は、この障害がクライアントに到達すると、厳密に型指定されたFaultExceptionではなく、nullのDetailセクションを持つ一般的なFaultExceptionです。

catch (FaultException<ValidationFault> valEx) 
{ 
    throw new FaultException<ValidationFault>(new ValidationFault(valEx.Detail.Message, valEx.Detail.PropertyName)); 
} 

それは強く型付けされたように、クライアントに到達した:I

だけではなく、BLLの方法で障害を再スローで、私が代わりにこのように同じパラメータでそれを再作成する場合ことがわかりましたFaultExceptionは予期した通りです。

私の質問です:なぜこの例外をBLLサービスで再作成する必要がありますか? DALサービスによってスローされた厳密に型指定されたFaultExceptionを単に通過できないのはなぜですか?私は作業するコードを持っていますが、何が起こっているのか理解したいと思います。私はそれが顔の中で私を見つめているが、私の人生はそれを把握することはできません何かだと思う。

答えて

0

確かに答えは私の顔を見ていたので、これが誰かを助けてくれる場合には、私の問題はFaultContractのActionプロパティでした。 FaultContract属性を指定して操作を修飾すると、明示的にActionを指定しない限り、WCFによって自動的に生成されます。このアクションには、FaultException名前空間と、障害を生成した操作のサービス名とメソッド名が含まれます。私のケースでは、私のBLLレイヤーのサービスとメソッド名は、最初に例外を生成したDALメソッドのサービスとメソッド名とは異なっていたので、DALとBLLレイヤーの両方の操作は同じ属性で装飾されていました。

[FaultContract(typeof(ValidationFault))] 

... FaultContractのアクションが異なりました。したがって、BLLサービスでDAL FaultExceptionを再発行しようとすると、FaultContractはBLL操作で指定されたFaultContractと一致せず、WCFは厳密に型指定されたものではなく一般的なFaultExceptionとして例外を再パックしていました。

この場合、私のオプションは適切なアクションを作成するBLLサービスでFaultExceptionを再作成することですが、クライアントに届くとBLLサービスから来ているようです。明示的に指定しないか、DALで生成されたFaultContract属性にActionプロパティを追加し、DALによって生成されたFaultのActionを指定しない限り、DALで発生したことは失われます。どちらが良いアイデアとより良い練習であろうと、これはおそらく他のトピック全体ですが、私は今何が起こっているのかを理解しています。

関連する問題