8
votes

Comment lancer une exception de rappel dans WCF ASYNC en utilisant iAsyncResult

J'utilise les appels ASYNC WCF dans mon projet et j'utilise des méthodes asynchrones latérales du client. J'ai un scénario comme ci-dessous -

  //Code in Business Layer and this method is called from Web layer 
    private void GetGeneralNews()
    {
        client.BeginGetGeneralNewsFeed(GeneralNewsCallback, null);
    }

    //Call Back Method
    private static void GeneralNewsCallback(IAsyncResult asyncResult)
    {
       string response = string.Empty;

       try
       {
          response = client.EndGetGeneralNewsFeed(asyncResult);
       }
       catch(Exception ex)
       {
          throw ex; // Here is the problem. It does not throw the exception to the web layer instead it will suppress the   error.
       }
    }


6 commentaires

Vérifiez que le lien peut être utile blogs.msdn.com/b/nikos/archive/2011/03/14/...


Dites-vous que votre bloc n'attribue aucune exception du tout? Si une exception non gérée est projetée dans le code côté serveur, votre bloc ci-dessus doit saisir une erreur par défaut.


Donc, vous voulez une exception à la bulle jusqu'à l'appelant lorsqu'il appelle getgéneralnews ?


Sur la même ligne que @USR, que vous attendez-vous à voir du côté du client? Voulez-vous une faute de savon, voulez-vous une collection d'erreurs? Voulez-vous une exception ?NET?


De plus, pouvez-vous inclure le contrat du service qui fournit le GénereTenalNewsfeed?


Comment votre client appelt-il une méthode privée?


3 Réponses :


0
votes

1) Si vous avez déjà généré le code client WCF avec async ("Commencer ..." / "Fin ...") Méthodes - que vous pouvez utiliser l'API de tâche de TPL pour travailler avec WCF (continue avec etc.) via la tâche .Factory.fromasync ( exemple ) - Bon pour faire face à l'héritage IAYNCRESTULT (" Commencez ... "/" Fin ... ") Méthodes / API (simple cependant, vous pouvez voir la source avec réflecteur);

2) Le code client généré par les outils n'est pas une bonne approche - au lieu de cela, vous pouvez écrire votre propre client-proxy universel avec un support ASYNC True-ASYNC (pas seulement l'utilisation du fil d'arrière-plan). ici est bon exemple comment commencer, vous avez besoin d'envelopper " Commencez ... "/" Fin ... "Méthodes avec des méthodes basées sur les tâches (utilisation de la même tâche.factory.fromasync) et utilisez des arbres d'expression pour obtenir des appels de méthode de service basés sur chaîne (je ne peux pas partager ma source de classe).

ou vous pouvez utiliser des solutions existantes telles que Ceci .

3) N'oubliez pas ConfigureAEAIT < / a>.

EDIT:

Vous n'avez pas à générer des opérations basées sur des tâches, il suffit de générer un code client WCF avec des méthodes d'opération de service ASYNC ("Commencer ..." / "Fin ..."). Ou vous pouvez même avoir seulement un contrat de WCF synchrone! (voir liens). TPL disponible dans .NET 4 (sans sucre syntaxique ASYNC / Await - qui est la fonction de langue CSharp 5.0). Utilisez-le (ContinuWith Await plutôt + quand, quand). Je l'ai utilisé même en 3.5 via les extensions Microsoft Reactive V1.0.2856.0. Afaik Extensions réactives était la version initiale qui a été incluse dans BCL. parallelExtensionSextras peut être utile aussi bien


2 commentaires

Comme je l'ai mentionné "Générer des opérations basées sur des tâches", ne sera disponible que dans la version 4.5 de .NET. Donc, je n'ai pas cette option ici.


Vous n'êtes pas obligé. Voir la réponse éditée. Lire attentivement.



2
votes

Voici une exemple d'application qui montre que WCF n'invalue pas l'exception. Si vous ne recevez pas l'exception, il doit être avalé par votre code côté serveur.

ready 
Got the exception: Please catch this


0 commentaires

0
votes

De toute façon, j'ai résolu ceci en utilisant TPL (Bibliothèque parallèle Task).

La raison pour laquelle j'avais eu des problèmes dans l'approche ci-dessus, mes nouveaux threads ne seront pas en mesure de reconnaître le fil principal, à partir de quelle couche la méthode a été appelée. Ainsi, en utilisant TPL, j'ai rendu mon fil principal attendre que mes autres threads font le travail et revenez puis sur la base de la réponse jettent l'exception.

J'espère que cela aide.


0 commentaires