2009-01-15 5 views
0

J'ai un service WCF qui fonctionne à 100% en mode synchrone (blocage) et j'ai maintenant besoin de retravailler un appel afin qu'il utilise le modèle asynchrone. Le service utilise l'authentification et effectue un transfert de fichiers en morceaux du client vers le serveur. Je l'ai donc retravaillé pour utiliser le préfixe asynchrone 'Begin' pour lancer l'appel.Existe-t-il un moyen d'obtenir un retour d'erreur sur les appels WCF asynchrones?

Maintenant, je teste les erreurs en mangeant délibérément les informations d'identification de l'utilisateur, ce qui provoque l'expiration de l'appel sur chaque partie du morceau de fichier qu'il essaie de transférer, ce qui prend beaucoup de temps. Le problème est que je ne reçois aucun retour d'erreur et ne peux pas voir comment l'obtenir si l'appel asynchrone échoue. Cela conduit à des fichiers très volumineux qui ne parviennent pas à être importés du tout, mais le client ne s'en rend pas compte car aucune exception n'est levée. J'ai les exceptions Debug-> Exceptions-> All CLR cochées pour voir si des exceptions sont avalées mais toujours rien. Donc, en résumé, comment obtenez-vous le retour d'erreur des appels asynchrones dans WCF?

Merci à l'avance,

Ryan

+0

Mise à jour: Juste pour clarifier, c'est un fichier GRAND qui est morcelées, il échoue sur chaque morceau (32k), mais ne se faire pas un rappel donc je ne voir que le fichier a échoué après qu'il a traité (et échoué) chaque morceau. Quel est le temps sur un fichier 1gb. –

Répondre

1

Le serveur met en cache l'exception pour vous et si vous appelez la méthode d'opération de fin d'achèvement pour votre async appeler jetteront des exceptions qui se sont produits.

private void go_Click(object sender, EventArgs e) 
{ 
    client.BeginDoMyStuff(myValue, new AsyncCallback(OnEndDoMyStuff), null); 
} 

public void OnEndDoMyStuff(IAsyncResult asyncResult) 
{ 
    this.Invoke(new MethodInvoker(delegate() { 
     // This will throw if we have had an error 
     client.EndDoMyStuff(asyncResult); 
    })); 
} 
+0

Merci, je peux voir comment cela peut être utile normalement, mais avec un gros transfert de fichiers, il va essayer de transférer le fichier entier en premier et le délai d'attente sur chaque morceau (plus long qu'un transfert de fichier normal). J'aurais espéré que cela m'aurait donné la possibilité d'échouer immédiatement. –

+0

Ah, je ne suis pas sûr de savoir comment vous le découpez (je n'ai jamais transféré de fichiers avec WCF), mais n'y a-t-il aucun moyen de le lancer si un seul bloc échoue? –

+0

Ne semble pas être, c'est là où je pense que le problème réside. Je vais dessiner autour de ça, merci Steve, –