【问题标题】:Fault Exceptions never being catched at client错误异常永远不会在客户端被捕获
【发布时间】:2012-09-21 06:06:23
【问题描述】:

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

服务层抛出异常,但客户端从未收到任何异常。我收到未处理的异常,例如,

底层连接已关闭:连接已关闭 没想到。

【问题讨论】:

    标签: asp.net wcf faultexception


    【解决方案1】:

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

    // Fault class:
    [DataMember]
    public Exception MyInnerException { get; set; }
    
    // Just before throwing the FaultException
    mx.MyInnerException = dvex; // <-- DivideByZeroException
    

    WCF 不喜欢对 DivideByZeroException 进行序列化,这是通过网络获取它所必需的。注释掉那行,事情可能会开始起作用。

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

    【讨论】:

    • 哦,听起来不错。好的,根据我的理解,我们不能从服务中传递根异常。相反,我们必须为异常创建自定义实例并分配所需的属性。请纠正我。
    • 是的:作为服务开发人员,您需要仔细挑选传递的异常详细信息 - 发送过多可能会带来安全风险。如果您也是客户端开发人员,您可能希望使用 IncludeExceptionDetailInFaults,请参阅我的更新答案。
    猜你喜欢
    • 2014-11-06
    • 2016-10-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多