2010-10-12 9 views
4

J'ai de la difficulté à piéger une exception pendant mes tests. En fait, je déconnecte le service de sorte que le point de terminaison n'est pas disponible et j'essaie de modifier mon application pour gérer cette possibilité. Le problème est que peu importe où je mets des blocs try/catch, je n'arrive pas à attraper cette chose avant qu'elle ne soit pas gérée.Où puis-je intercepter une exception EndpointNotFoundException pour un appel WCF asynchrone?

J'ai essayé emballage à la fois mon code de création try/catch,

this.TopicServiceClient = new KeepTalkingServiceReference.TopicServiceClient(); 
      this.TopicServiceClient.GetAllTopicsCompleted += new EventHandler<KeepTalkingServiceReference.GetAllTopicsCompletedEventArgs>(TopicServiceClient_GetAllTopicsCompleted); 
      this.TopicServiceClient.GetAllTopicsAsync(); 

ainsi que le délégué qui est appelé lorsque l'appel de service est terminée.

public void TopicServiceClient_GetAllTopicsCompleted(object sender, KeepTalkingServiceReference.GetAllTopicsCompletedEventArgs e) 
     { 
      try 
      { 
... 

Aucun dés. Des pensées?

Répondre

2

Je vous recommande d'utiliser le IAsyncResult. Lorsque vous générez le proxy WCF sur le client et recevez les appels asynchrones, vous devez obtenir une méthode TopicServiceClient.BeginGetAllTopics(). Cette méthode renvoie un objet IAsyncResult. Il prend également un délégué AsyncCallback à appeler quand il se termine. Quand il est terminé, vous appelez EndGetAllTopics() fournissant le fichier IASyncResult (passé à EndGetAllTopics)

Vous mettez un try/catch autour de votre appel à BeginGetAllTopics() et vous devriez attraper l'exception que vous recherchez. à distance, c'est-à-dire que vous vous connectez, mais le service lance une exception, qui est traitée au moment où vous appelez le EndGetAllTopics()

Voici un exemple très simple (clairement pas de production) pour démontrer ce que je disons que cela a été écrit dans WCF 4.0

namespace WcfClient 
{ 
class Program 
{ 
    static IAsyncResult ar; 
    static Service1Client client; 
    static void Main(string[] args) 
    { 
     client = new Service1Client(); 
     try 
     { 
      ar = client.BeginGetData(2, new AsyncCallback(myCallback), null); 
      ar.AsyncWaitHandle.WaitOne(); 
      ar = client.BeginGetDataUsingDataContract(null, new AsyncCallback(myCallbackContract), null); 
      ar.AsyncWaitHandle.WaitOne(); 
     } 
     catch (Exception ex1) 
     { 
      Console.WriteLine("{0}", ex1.Message); 
     } 
     Console.ReadLine(); 
    } 
    static void myCallback(IAsyncResult arDone) 
    { 
     Console.WriteLine("{0}", client.EndGetData(arDone)); 
    } 
    static void myCallbackContract(IAsyncResult arDone) 
    { 
     try 
     { 
      Console.WriteLine("{0}", client.EndGetDataUsingDataContract(arDone).ToString()); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("{0}", ex.Message); 
     } 
    } 
} 
} 

Pour l'exception côté serveur de propager ba ck au client, vous devez définir ce qui suit dans la configuration web du serveur ...

<serviceDebug includeExceptionDetailInFaults="true"/>