Allgemeine Diskussion IErrorHandler und eigene FaultException generieren

  • Donnerstag, 28. Juli 2011 06:58
     
      Enthält Code

    Hi,

    ich habe auf einem WCF Webservice einen eigenen Error Handler implementiert. Dort sollen spezielle Exceptions von mir FaultExceptions geneieren und diesen zusätzliche Informationen mitgeben. Der Code sieht im moment so aus:

      public void ProvideFault(Exception error, System.ServiceModel.Channels.MessageVersion version, ref System.ServiceModel.Channels.Message fault)
      {
       FaultException<string> faultException = new FaultException<string>("Test", "Test");
       MessageFault messageFault = faultException.CreateMessageFault();
       fault = Message.CreateMessage(version, messageFault, faultException.Action);  
      }
    
    

    Das funktioniert auch ohne Probleme. Verwende ich aber nun anstelle von string eine eignen Datentyp, so kommt auf dem Client nicht mehr die generierte FaulException an sondern nur noch eine allgemein gültige Fehlermeldung, das der Server die Verbindung abgebrochen hat. Zum Testen hatte ich mir folgende Klasse angelegt:

     [Serializable]
     [DataContract]
     public class MyFaultDetail
     {
      public MyFaultDetail()
      {
       this.Name = "Test";
      }
    
      [DataMember(IsRequired=true)]
      public string Name { get; set; }
     }
    
    

    Muss ich diesen Datentyp noch irgendwo erstmal registrieren!? Stehe da im moment ein bischen auf dem Schlauch!

    Gruß

    Martin

Alle Antworten

  • Donnerstag, 28. Juli 2011 07:33
     
     

    Hallo Martin,

    hast du im ServiceContract die betroffenen Methoden mit dem "FaultContract" Attribute versehen?

  • Donnerstag, 28. Juli 2011 07:57
     
     

    Hallo Marco,

    ja, habe ich. Hat aber auch keine Änderung gebracht. Wenn ich in diesen Methoden die gleiche Exception von Hand auslöse, dann kommt diese auf dem Client auch korrekt an!?

    Gruß

    Martin

     

  • Donnerstag, 28. Juli 2011 08:36
     
     

    Kannst du den Code dazu mal posten?
    Das manuelle Auslösen der Methode im ServiceContract wäre interessant und die Stelle die nicht funktioniert.

     

  • Donnerstag, 28. Juli 2011 10:26
     
      Enthält Code

    Hi,

    also der Code ist jetzt nix dolles:

      public void deletePas(long vlID)
      {
       throw new FaultException<PaFaultDetail>(new PaFaultDetail(), "Test");
      }
    
    

    Und im zugehörigen Interface:

      [OperationContract]
      [FaultContract(typeof(PaFaultDetail), Action="http://adele.ihk.de/PaFaultDetail")]
      void deletePas(long vlID);
    
    

     

    Gruß

    Martin

     

  • Donnerstag, 28. Juli 2011 10:55
     
     

    >>Wenn ich in diesen Methoden die gleiche Exception von Hand auslöse, dann kommt diese auf dem Client auch korrekt an!?

    Also das manuelle auslösen funktioniert? Welche Stelle funktioniert denn nicht?

  • Donnerstag, 28. Juli 2011 11:13
     
     

    Na die in der ProvideFault Methode vom ErrorHandler. Ich gernerie dort eben eine FaultException aber diese kommt auf dem Client nicht an. Die Meldung die ich testweise schicke geht verloren und vom Webservice kommt nur eine allgemeingültige Exception, dass auf dem Server irgendwas nicht geht.

    Gruß

    Martin

     

  • Donnerstag, 28. Juli 2011 11:19
     
     

    Schau dir mal folgenden Link an. Vieleicht hilft er dir weiter im Bereich der Konfiguration:

    http://www.neovolve.com/post/2008/04/07/implementing-ierrorhandler.aspx

     

  • Donnerstag, 28. Juli 2011 13:40
     
     

    Hi,

    danke, werde ich morgen nochmal in Ruhe durchgehen. Einen Unterschied habe ich schon mal gefunden. In dem Beispiel wird der Error-Handler im Service Behavio registriert. Ich trage meinen Error Handler aber in einem Endpoint Behavior ein. Bin mir zwar nicht sicher, ob das was ausmacht. Werde das aber mal kontrollieren.

     

    Gruß

    Martin