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 进行序列化,这是通过网络获取它所必需的。注释掉那行,事情可能会开始起作用。

除此之外,通常您不希望传递内部异常(至少:不是这样),因为这将被视为安全风险。但是有一个例外:这是在您进行调试时。在这种情况下,请参阅有关IncludeExceptionDetailInFaults的文章:这使您可以在客户端查看异常详细信息。

于 2012-09-21T06:41:10.327 回答