“此错误的创建者未指定原因”例外

时间:2008-12-04 17:49:59

标签: c# .net wcf faults

我在WCF服务中有以下代码,可根据特定情况抛出自定义错误。我得到一个“这个错误的创建者没有指定原因”例外。我做错了什么?

//source code
if(!DidItPass)
{
    InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");
    throw new FaultException<InvalidRoutingCodeFault>(fault);
}

//operation contract
[OperationContract]
[FaultContract(typeof(InvalidRoutingCodeFault))]
bool MyMethod();

//data contract
[DataContract(Namespace="http://myuri.org/Simple")]
public class InvalidRoutingCodeFault
{
    private string m_ErrorMessage = string.Empty;

    public InvalidRoutingCodeFault(string message)
    {
        this.m_ErrorMessage = message;
    }

    [DataMember]
    public string ErrorMessage
    {
        get { return this.m_ErrorMessage; }
        set { this.m_ErrorMessage = value; }
    }
}

9 个答案:

答案 0 :(得分:44)

经过一些额外的研究,以下修改后的代码有效:

if(!DidItPass)
{    
    InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started");    
    throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason("Invalid Routing Code - No Approval Started"));
}

答案 1 :(得分:8)

serviceDebug includeExceptionDetailInFaults="true"

不是解决方案

以下代码甚至适用于serviceDebug includeExceptionDetailInFaults="false"

// data contract 

[DataContract]
public class FormatFault
{
    private string additionalDetails;

    [DataMember]
    public string AdditionalDetails
    {
        get { return additionalDetails; }
        set { additionalDetails = value; }
    }
}

// interface method declaration

    [OperationContract]
    [FaultContract(typeof(FormatFault))]
    void DoWork2();

// service method implementation

    public void DoWork2()
    {
        try
        {
            int i = int.Parse("Abcd");
        }
        catch (FormatException ex)
        {
            FormatFault fault = new FormatFault();
            fault.AdditionalDetails = ex.Message;
            throw new FaultException<FormatFault>(fault);
        }
    }

// client calling code

    private static void InvokeWCF2()
    {
        ServiceClient service = new ServiceClient();

        try
        {
            service.DoWork2();
        }
        catch (FaultException<FormatFault> e)
        {
            // This is a strongly typed try catch instead of the weakly typed where we need to do -- if (e.Code.Name == "Format_Error")
            Console.WriteLine("Handling format exception: " + e.Detail.AdditionalDetails);   
        }
    }

如果不需要,则无需添加故障原因。只需确保FaultContract属性正确

答案 2 :(得分:5)

我使用两个参数构造函数解决了这个问题。

// service method implementation

 throw new FaultException<FormatFault>(fault,new FaultReason(fault.CustomFaultMassage)); 

自定义故障消息是来自数据合同的属性。

答案 3 :(得分:2)

如果没有为方法指定FaultContract(typeof(className))属性,也会遇到此异常

答案 4 :(得分:2)

如果您不希望收到此类异常的通知,请转到Debug - &gt;例外并取消选中“公共语言运行时异常”或特定例外的“用户未处理”。

答案 5 :(得分:1)

我的代码与Rashmi完全一样,我得到了“这个错误的创造者......”错误。当我在VS2010中调试时发生了这种情况。我找到了这篇文章:

http://sergecalderara.wordpress.com/2008/11/25/systemservicemodelfaultexception1-was-unhandled-by-user-code/

解释了我需要关闭的几个调试选项。问题解决了。

答案 6 :(得分:0)

您可以在服务器配置中尝试此操作(行为 - &gt; serviceBehaviors - &gt;行为):

<serviceDebug includeExceptionDetailInFaults="true" />

答案 7 :(得分:0)

通过使用强类型的try catch,我能够解决错误“此错误的创建者没有指定原因”。

答案 8 :(得分:0)

在客户端更新服务引用解决了问题。同样适用于你。