1

WCF サービスに FaultException を実装しようとしています。いろいろな記事を参考にしました。ただし、クライアントで FaultExceptions がキャッチされることはないようです。私はこのようなコードを書きました、

サービス契約 -

 [ServiceContract]
    public interface IService2
    {
        [OperationContract]
        [FaultContract(typeof(MyException))]
        [DebuggerStepThrough]
        MyException GetData(int value);
    }

    [DataContract]
    public class MyException 
    {
        [DataMember]
        public bool Result { get; set; }

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

        [DataMember]
        public Exception MyInnerException { get; set; }

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

サービスの実装 -

public class Service1 : IService2
    {

        public MyException GetData(int value)
        {
            MyException mx = new MyException();
            try
            {
                double a = 44;
                if (value == 0)
                {
                    throw new DivideByZeroException();
                }
                double res = a / value;
                mx.ClientMessage = "Everything is well";
                mx.Result = true;
                return mx;
            }
            catch (DivideByZeroException dvex)
            {
                mx.Result = true;
                mx.ClientMessage = "Divide by zero";
                mx.MyInnerException = dvex;
                mx.ErrorMessage = dvex.StackTrace;
                throw new FaultException<MyException>(mx, dvex.ToString());
            }                      

        }
    }

クライアント (aspx.cs ページ) -

try
            {
                FaultContractsDemo.ServiceReference1.Service2Client o = new ServiceReference1.Service2Client();
                MyException data = o.GetData(0);
                if (data.Result)
                    lblMessage.Text = "All is well";
            }
            catch (FaultException<MyException> ex)
            {
                lblMessage.Text = ex.Detail.ClientMessage;
            }

サービス層は例外をスローしますが、クライアントは例外を受け取りません。次のような未処理の例外が発生しています。

基になる接続が閉じられました: 接続が予期せず閉じられました。

4

1 に答える 1

0

この問題を再現できました(別の、しかし非常によく似た状況で)。問題はこの組み合わせによって引き起こされます:

// Fault class:
[DataMember]
public Exception MyInnerException { get; set; }

// Just before throwing the FaultException
mx.MyInnerException = dvex; // <-- DivideByZeroException

WCFは、DivideByZeroExceptionをシリアル化することを好みません。これは、ネットワークを介して取得するために必要です。その行をコメントアウトすると、物事はおそらく機能し始めるでしょう。

これに加えて、通常は内部例外を渡したくないでしょう(少なくとも:これは好きではありません)。これはセキュリティリスクと見なされるためです。ただし、例外が1つあります。これは、デバッグ中の場合です。その場合は、IncludeExceptionDetailInFaultsの記事を参照してください。これにより、クライアント側で例外の詳細を確認できます。

于 2012-09-21T06:41:10.327 に答える