客户端不会捕获通用的FaultException ,只有FaultException

我已经阅读了所有有关此内容的内容,但也许我错过了一些东西(好吧,我肯定错过了一些东西,否则它会有效)

我在服务器业务层中抛出了一些exception错误:

public class RfcException : Exception { public RfcException(string _m, Exception _inner) : base(_m, _inner) { } public Dictionary ExtendedProperties { get { return extendedProperties; } protected set { extendedProperties = value; } } private Dictionary extendedProperties = new Dictionary(); } 

我在服务中未处理,但我有一个IErrorHandler来捕获并创建一个FaultMessage

 public class FaultErrorHandler : BehaviorExtensionElement, IErrorHandler, IServiceBehavior { public bool HandleError(Exception error) { if (!Logger.IsLoggingEnabled()) return true; var logEntry = new LogEntry { EventId = 100, Severity = TraceEventType.Error, Priority = 1, Title = "WCF Failure", Message = string.Format("Error occurred: {0}", error) }; logEntry.Categories.Add("MiddleTier"); Logger.Write(logEntry); return true; } public void ProvideFault(Exception error, System.ServiceModel.Channels.MessageVersion version, ref System.ServiceModel.Channels.Message fault) { if (error is RfcException) { RfcException rfcException = error as RfcException; var serviceFault = new RfcServiceFault(rfcException); var faultException = new FaultException(serviceFault, new FaultReason(string.Format("System error occurred, exception: {0}", error))); var faultMessage = faultException.CreateMessageFault(); fault = Message.CreateMessage(version, faultMessage, Schema.WebServiceStandard); } else { var faultException = new FaultException(error, new FaultReason(string.Format("System error occurred, exception: {0}", error))); var faultMessage = faultException.CreateMessageFault(); fault = Message.CreateMessage(version, faultMessage, Schema.WebServiceStandard); } } public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) { foreach (ChannelDispatcher chanDisp in serviceHostBase.ChannelDispatchers) { chanDisp.ErrorHandlers.Add(this); }; } public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) { } public override Type BehaviorType { get { return typeof(FaultErrorHandler); } } protected override object CreateBehavior() { return new FaultErrorHandler(); } } 

没必要问; 我已经通过调试器确认它输入了部分if (error is RfcException)部分,我已经逐步完成了代码并且直到最后都没有任何问题。 那个errorHandler包装了一个FaultException消息, RfcServiceFault消息就是这个

 [DataContract(Name = "RfcServiceFault", Namespace = "Service.DataTransfer.Rfc")] public class RfcServiceFault { public RfcServiceFault(RfcException rfcException) : this( (Exception)rfcException ) { ExtendedProperties = new Dictionary(rfcException.ExtendedProperties); } public RfcServiceFault() { } public RfcServiceFault(Exception regularException) { FaultMessage = regularException.Message; StackTrace = regularException.StackTrace; } public Dictionary ExtendedProperties { get { return extendedProperties; } protected set { extendedProperties = value; } } [DataMember] private Dictionary extendedProperties = new Dictionary(); [DataMember] public string FaultMessage { get; set; } [DataMember] public string StackTrace { get; set; } } 

该服务具有应该具有带faultcontract的wcf服务的所有注释:

 [ServiceContract(Name = "MyService", Namespace = Schema.WebServiceStandard, SessionMode = SessionMode.Allowed)] public interface IMyService { [OperationContract(Name = "GetStuff")] [FaultContract(typeof(RfcServiceFault) , Name="RfcServiceFault", Namespace="Service.DataTransfer.Rfc")] LookupResult GetStuff(); } 

现在:在客户端测试,这样一个简单的测试:

 try { var result = myService.GetStuff(); Assert.IsTrue(!string.IsNullOrEmpty(result)); } catch (FaultException rfcEx) { // OMG FOR THE LIFE OF THE PUPPIES ENTER HERE } catch (FaultException rr) { // it always falls in here } catch (Exception ex) { } 

我读过很多很多关于这个类似问题的post:

  • 无法处理FaultException
  • 抛出一般的FaultException
  • c#WCF捕获Base类型的故障exception
  • WCF:WSDL优先方法:生成故障类型的问题

到目前为止似乎没有任何帮助,我已经尝试在web.config中设置WCF跟踪:

          

我在那里得到一个svclog文件,我用WCF Trace查看器打开,但我只看到一堆消息,黄色显示Exception,但它只确认客户端已经看到的内容, System.ServiceModel.FaultException是收到,而不是通用的

任何想法如何解决这个问题?

编辑忘了提,我在配置中启用了我的error handling程序,如下所示:

  .....  .....          

(这在黑暗中有点刺伤)我相信你可能有问题,因为故障上的操作与客户端预期的不一致。 你可以用以下内容替换你的CreateMessage:

 fault = Message.CreateMessage(version, faultMessage, faultException.Action);