wcf FaultException原因

时间:2014-01-06 16:47:55

标签: c# .net wcf exception faultexception

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

  

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

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

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

2 个答案:

答案 0 :(得分:4)

如果您希望将所有例外转发给呼叫者,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);
    }
}

答案 1 :(得分:3)

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

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

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