【问题标题】:wcf FaultException Reasonwcf FaultException 原因
【发布时间】:2014-01-24 03:34:34
【问题描述】:

对于以下异常,在异常窗口中没有指定原因(->查看详细信息):

System.ServiceModel.FaultException 此故障的创建者未指定原因。 如何更改它以显示原因? (我需要在那里显示 1234)

public class MysFaultException
{
    public string Reason1
    {
        get;
        set;
    }
}

MyFaultException connEx = new MyFaultException();
connEx.Reason1 = "1234";
throw new FaultException<OrdersFaultException>(connEx);

【问题讨论】:

    标签: c# .net wcf exception faultexception


    【解决方案1】:

    虽然I3arnon answer 如果您希望将所有异常都转发给调用者,这很好,但如果您只希望通过一组有限的已知故障,您可以创建Fault Contracts,让调用者知道一组特定的可能会出现异常,因此客户端可以准备好处理它们。这允许您传递潜在的预期异常,而无需将您的软件可能引发的所有异常都转发给客户端。

    这是来自 MSDN 的一个简单示例,它显示 WCF 服务捕获 DivideByZeroException 并将其转换为 FaultException 以传递给客户端。

    [ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
    public interface ICalculator
    {
        //... (Snip) ...
    
        [OperationContract]
        [FaultContract(typeof(MathFault))]
        int Divide(int n1, int n2);
    }
    
    [DataContract(Namespace="http://Microsoft.ServiceModel.Samples")]
    public class MathFault
    {    
        private string operation;
        private string problemType;
    
        [DataMember]
        public string Operation
        {
            get { return operation; }
            set { operation = value; }
        }
    
        [DataMember]        
        public string ProblemType
        {
            get { return problemType; }
            set { problemType = value; }
        }
    }
    
    //Server side function
    public int Divide(int n1, int n2)
    {
        try
        {
            return n1 / n2;
        }
        catch (DivideByZeroException)
        {
            MathFault mf = new MathFault();
            mf.operation = "division";
            mf.problemType = "divide by zero";
            throw new FaultException<MathFault>(mf);
        }
    }
    

    【讨论】:

    • 大多数时候矫枉过正......但一个非常好的概念。
    • @I3arnon 我不会将它用于内部应用程序,但是如果我制作一个任何人都可以连接到它的面向公众的 API,肯定有助于减少信息泄露给可能试图攻击服务器的人(给你的答案+1,因为我认为这也是更好的选择,但很高兴看到所有选项。
    • 我同意,它可以成为合同的一部分。
    【解决方案2】:

    WCF 服务使用includeExceptionDetailInFaults="false" 选择不显示一般错误背后的原因。您可以在配置文件中更改它:

    <services>
        <service name="serviceHost" behaviorConfiguration="serviceBehavior">
            <endpoint .... />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="serviceBehavior">
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    

    您不需要创建自己的异常。 FaultException 将包装您服务中抛出的真正异常,并向您显示消息和相关信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多