le client n’acceptera pas FaultException générique , uniquement FaultException

J’ai lu tout ce qu’il y a à lire à ce sujet, mais peut-être me manque-t-il quelque chose

Je génère une erreur d’exception dans la couche de gestion de mon serveur:

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

que je laisse non géré dans le service, mais j’ai un IErrorHandler pour attraper et créer un 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 = ssortingng.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(ssortingng.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(ssortingng.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(); } } 

Pas besoin de demander; J’ai déjà confirmé au débogueur son entrée dans la partie if (error is RfcException) , j’ai parcouru ce code et il parvient jusqu’à la fin sans aucun problème. Que errorHandler encapsule un FaultException , le message RfcServiceFault est le 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 ssortingng FaultMessage { get; set; } [DataMember] public ssortingng StackTrace { get; set; } } 

Le service a toutes les annotations qui devraient avoir un service wcf avec un faultContract:

 [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(); } 

Maintenant: test chez le client, un test simple comme celui-ci:

 try { var result = myService.GetStuff(); Assert.IsTrue(!ssortingng.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) { } 

J’ai lu de nombreux articles sur ce sujet:

  • Ne peut pas gérer FaultException
  • Lancer FaultException générique
  • c # WCF catch Exceptions de faute du type de base
  • WCF: approche WSDL-first: problèmes de génération de types d’erreur

mais rien ne semble aider jusqu’à présent, j’ai essayé de configurer le traçage WCF dans le fichier web.config:

          

et je reçois un fichier svclog, je l’ouvre avec le visualiseur Trace WCF, mais je ne vois que quelques messages, le message jaune indique l’exception, mais il ne fait que confirmer ce que le client voit déjà, un System.ServiceModel.FaultException reçu, plutôt que le générique

Des idées comment comprendre cela?

EDIT a oublié de mentionner, j’ai activé mon gestionnaire d’erreurs dans la configuration comme ceci:

  .....  .....          

(Il s’agit d’un coup de couteau dans le noir) Je pense que vous pouvez avoir un problème car l’action sur la faute ne correspond pas à celle attendue chez le client. Pouvez-vous s’il vous plaît remplacer votre CreateMessage par ce qui suit:

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