故障异常永远不会被客户端捕获

时间:2012-09-21 06:06:23

标签: asp.net wcf faultexception

我正在尝试在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;
            }

服务层抛出异常,但客户端永远不会收到任何异常。我得到了未处理的异常,例如,

  

基础连接已关闭:连接已关闭   出乎意料。

1 个答案:

答案 0 :(得分:0)

我可以重现这个问题(在一个不同但非常相似的情况下)。问题是由这种组合引起的:

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

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

WCF不喜欢序列化DivideByZeroException,这是通过网络获取它所必需的。注释掉那条线和东西可能会开始起作用。

要添加到此,通常您不会希望传递内部异常(至少:不是这样),因为这将被视为安全风险。但有一个例外:这是你正在调试的时候。在这种情况下,请参阅IncludeExceptionDetailInFaults上的文章:这允许您在客户端查看异常详细信息。