2010-12-20 4 views
2

Im Moment wickle ich alle meine WCF-Serviceanrufe in den folgenden try/catch-Block ein und frage mich, ob es eine Möglichkeit gibt, dies an einem Ort festzulegen und für alle Serviceanrufe gelten zu lassen.Gibt es eine Möglichkeit, WCF-Serverfehler an einer Stelle auf dem Client zu behandeln?

try 
{ 
    Product test = client.GetProductById(1); 
} 
catch (TimeoutException ex) 
{ 
    WPFMessageBox.Show("The service operation timed out." + ex.Message); 
} 
catch (FaultException<CustomFault> ex) 
{ 
    WPFMessageBox.Show("CustomFault:" + ex.ToString()); 
} 
catch (FaultException ex) 
{ 
    WPFMessageBox.Show("Unknown Fault:" + ex.ToString()); 
} 
catch (CommunicationException ex) 
{ 
    WPFMessageBox.Show("There was a communication problem" + ex.Message + 
         ex.StackTrace); 
} 

Antwort

4

Sie könnten ein Wrapper-Methode schreiben, die den Code erhalten den Service-Aufruf von einem Delegierten übergeben auszuführen:

public T ServiceCallWrapper<T>(Func<T> serviceCallDelegate) 
{ 
    try 
    { 
     return serviceCallDelegate(); 
    } 
    catch (TimeoutException ex) 
    { 
     WPFMessageBox.Show("The service operation timed out." + ex.Message); 
    } 
    catch (FaultException<CustomFault> ex) 
    { 
     WPFMessageBox.Show("CustomFault:" + ex.ToString()); 
    } 
    catch (FaultException ex) 
    { 
     WPFMessageBox.Show("Unknown Fault:" + ex.ToString()); 
    } 
    catch (CommunicationException ex) 
    { 
     WPFMessageBox.Show("There was a communication problem" + ex.Message + 
          ex.StackTrace); 
    } 
} 

Dann können Sie den Wrapper zum Beispiel mit einer anonymen Methode wie folgt aufrufen:

Product test = ServiceCallWrapper<Product>(() => client.GetProductById(1)); 
+0

Danke, das ist schön und einfach. – Rachel

+0

Jan, wie würde dieser Wrapper nach Methoden suchen, die einen oder mehrere Parameter akzeptieren, aber keinen Wert zurückgeben? (z. B. sind void.) (Ex: interne statische void LockoutUser (Zeichenfolge BenutzerID, int timeInSeconds)) – FarrEver

+0

@FarrEver, Exchange Func mit Aktion in der Methode ServiceCallWrapper: 'öffentliche void ServiceCallWrapper (Aktion serviceCallDelegate)' – Jan

1

Sie könnten dies über AoP und IoC tun.

Hier habe ich geschrieben, wie: http://pablocastilla.wordpress.com/2010/11/09/aop-and-ioc-in-wcf-4-0-with-enterprise-library-5-and-appfabric-part-1/

Es gibt ein Codebeispiel ist.

+0

Ich bin mir nicht sicher, ob ich verstehe, wie das funktioniert, um Serverfehler auf dem Client zu fangen. Kannst du etwas erklären? – Rachel

+0

Sie würden sie als AoP-Stil fangen. Über die Konfiguration der Enterprise Library konfigurieren Sie den Client, um die Ausnahmen auf verschiedene Arten zu bearbeiten. –

+0

Vielen Dank, ich würde es gerne ein wenig weiter untersuchen, aber jetzt habe ich nicht die Zeit so akzeptiert Jan's Antwort – Rachel

Verwandte Themen