“这个错误的创造者没有指定一个理由”exception

我有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; } } } 

经过一些额外的研究,以下修改的代码工作:

 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")); } 

简单的答案是你没有做错什么,只是不正确地阅读结果。

在客户端捕获错误时,捕获的是System.ServiceModel.FaultException<InvalidRoutingCodeFault>types的System.ServiceModel.FaultException<InvalidRoutingCodeFault>types。
InvalidRoutingCodeFault对象实际上在FaultException的.detail属性中。 所以….

//客户端代码

 private static void InvokeMyMethod() { ServiceClient service = new MyService.ServiceClient(); try { service.MyMethod(); } catch (System.ServiceModel.FaultException<InvalidRoutingCodeFault> ex) { // This will output the "Message" property of the System.ServiceModel.FaultException // 'The creator of this fault did not specify a Reason' if not specified when thrown Console.WriteLine("faultException Message: " + ex.Message); // This will output the ErrorMessage property of your InvalidRoutingCodeFault type Console.WriteLine("InvalidRoutingCodeFault Message: " + ex.Detail.ErrorMessage); } } 

FaultException的Message属性是在错误页面上显示的,所以如果它没有像John Egerton的post那样填充,你会看到'这个错误的创build者没有指定一个Reason'消息。 为了方便地填充它,请按如下方式在服务中引发错误时使用两个参数构造函数,从错误types中传递错误消息:

 InvalidRoutingCodeFault fault = new InvalidRoutingCodeFault("Invalid Routing Code - No Approval Started"); throw new FaultException<InvalidRoutingCodeFault>(fault, new FaultReason(fault.ErrorMessage)); 
 serviceDebug includeExceptionDetailInFaults="true" 

不是解决scheme

下面的代码甚至可以用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属性是正确的

我用一个双参数构造函数解决了这个问题。

 // service method implementation throw new FaultException<FormatFault>(fault,new FaultReason(fault.CustomFaultMassage)); 

CustomFaultMassage是数据合同的属性。

如果没有为该方法指定FaultContract(typeof(className))属性,也可以遇到此exception

我的代码和Rashmi完全一样,而我得到了“这个错误的创造者……”的错误。 当我在VS2010中进行debugging时发生了这种情况。 我发现这个职位:

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

其中解释了一些我需要closures的debugging选项。 问题解决了。

如果你不想被通知这样的例外,去debugging – >例外,并取消select“用户未处理”的“公共语言运行时例外”或特定的例外。

你可能会尝试在服务器configuration(行为 – > serviceBehaviors – >行为):

 <serviceDebug includeExceptionDetailInFaults="true" /> 

通过使用强types的try catch,我能够解决错误“这个错误的创build者没有指定一个Reason”。

更新客户端中的服务引用解决了这个问题。 同样可以为你工作。