9

WCF が例外をエラーに変換し、SOAP メッセージとして送り返すことは理解していますが、これが本当に相互運用可能かどうか疑問に思っていました。この考えられるシナリオを理解しようとするのに苦労していると思います:

  1. クライアント (Java) が WCF サービス (LoginService) を呼び出します。
  2. サーバーは適切な承認をチェックしますが、ユーザー承認は失敗します。
  3. サーバーが UnauthorizedAccessException をスローします。
  4. WCF はこれを Fault に変換します。(* - 以下も参照)
  5. クライアントは、このフォールトの読み取り方法を認識できなければなりません。

.NET が UnauthorizedAccessException からエンコードする SOAP Fault を Java が変換する方法を Java が認識していることを期待しているため、これがどのように相互運用可能であるかを理解するのに苦労していると思います。

  • また、.NET が実際にどのように例外を障害に変換するのか、障害コード、名前などとして何が入るのか。おそらく障害名が「UnauthorizedAccessException」のように「当然」のように見えるものもありますが、私は '推測するよりも確実に知っている方がよい。
4

3 に答える 3

9

「自動変換」はありません。未処理の例外が発生した場合、WCF はエラーを返します (どれかは忘れました)。しかし、その障害を宣言しなかったため、それを返すと、ほとんどではないにしても多くのクライアントが失敗します。

独自の障害を定義し、代わりにそれらを返すことを意図しています。検討:

[DataContract]
public class MySpecialFault
{
    public string MyMessage { get; set; }
}

[ServiceContract]
public interface IMyService
{
    [FaultContract(typeof (MySpecialFault))]
    [OperationContract]
    void MyOperation();
}

public class MyService : IMyService
{
    public void MyOperation()
    {
        try
        {
            // Do something interesting
        }
        catch (SomeExpectedException ex)
        {
            throw new FaultException<MySpecialFault>(
                new MySpecialFault {MyMessage = String.Format("Sorry, but {0}", ex.Message)});
        }
    }
}

障害を処理できるクライアントは、これに対処します。WSDL は障害を定義し、送信された MySpecialFault インスタンスのシリアル化されたバージョンを含む Detail 要素で障害を確認します。そのインスタンスのすべてのプロパティを読み取ることができます。

于 2011-01-11T03:34:31.563 に答える
4

フォルトは、v1.1 以降の SOAP 仕様の一部です。それらはSOAP 仕様で説明されています。

障害が仕様に従って処理されることを保証するのは、実装 (WCF、Java など) 次第です。

WCF は SOAP 仕様に従って FaultExceptions を Faults に変換するため、WCF からスローされた FaultExceptions は相互運用可能です。

于 2011-01-10T21:52:32.970 に答える
2

SOAP 障害は相互運用可能ですが、.Net 例外クラスは SOAP 障害で使用するのには適していません。代わりに、独自の DataContract クラス (AccessFault など) を定義してから、それを FaultContract で使用します。http://msdn.microsoft.com/en-us/library/ms733841.aspxを参照してください

サービス境界で UnauthorizedAccessException がスローされるたびに、それを FaultException に変換します。これは、Microsoft Enterprise Library Exception Handling Block の使用や IErrorHandler インターフェイスの実装など、いくつかの方法で実行できます。

于 2011-01-10T22:12:38.873 に答える