2011-01-20 2 views
1

J'ai un client WCF qui a lancé cette erreur commune, juste pour être résolu en retentissant l'appel HTTP au serveur. Pour ce que ça vaut cette exception n'a pas été générée dans 1 minute. Il a été généré en 3 secondes.Quelles exceptions WCF devrais-je réessayer en cas d'échec? (tel que l'hôte xxx 'n'a pas reçu une réponse dans 00:01:00')

L'opération de demande envoyée à xxxxxx n'a pas reçu une réponse dans le délai configuré (0:01:00). Le temps alloué à cette opération peut ont été une partie d'un délai d'expiration plus long . Cela peut être dû au fait que le service traite toujours l'opération ou parce que le service était incapable d'envoyer un message de réponse. S'il vous plaît envisager d'augmenter le fonctionnement délai d'attente (par coulée du canal/proxy à IContextChannel et le réglage de la propriété OperationTimeout) et d'assurer que le service est en mesure de se connecter à le client

Comment sont des professionnels qui manipulent ces erreurs WCF courantes? Quelles autres fausses erreurs dois-je gérer. Par exemple, je considère chronométrer l'appel WCF et si cette erreur ci-dessus (faux) est levée en moins de 55 secondes, je retenter l'opération entière (en utilisant une boucle while()). Je crois que je dois réinitialiser toute la chaîne, mais j'espère que vous me direz ce qu'il est bon de faire.

Quels sont les autres

+0

Je vous suggère de poser une question distincte sur les raisons pour lesquelles le délai d'attente de 1 minute est écoulé après 3 secondes. Ce n'est pas vraiment la façon dont cela fonctionne. –

+0

@John: Cela ne se fait qu'occasionnellement pendant que je développe et attend le démarrage de Azure Fabric. Je devine que c'est une erreur réessayable, et la plupart de mon code est basé entièrement sur les échantillons de WCF. – LamonteCristo

+0

le facteur Azure est une bonne raison de poser une question distincte. –

Répondre

1

Je fais tous mes appels WCF d'une coutume « en utilisant » déclaration qui gère les exceptions et prend sa retraite potentiels. Mon code me permet en option de passer un objet de politique à l'instruction afin que je puisse facilement changer le comportement, comme si je ne veux pas réessayer en cas d'erreur.

L'essentiel du code est le suivant:

[MethodImpl(MethodImplOptions.NoInlining)] 
public static void ProxyUsing<T>(ClientBase<T> proxy, Action action) 
    where T : class 
{ 
    try 
    { 
     proxy.Open(); 
     using(OperationContextScope context = new OperationContextScope(proxy.InnerChannel)) 
     { 
      //Add some headers here, or whatever you want 
      action(); 
     } 
    } 
    catch(FaultException fe) 
    { 
     //Handle stuff here 
    } 
    finally 
    { 
     try 
     { 
      if(proxy != null 
       && proxy.State != CommunicationState.Faulted) 
      { 
       proxy.Close(); 
      } 
      else 
      { 
       proxy.Abort(); 
      } 
     } 
     catch 
     { 
      if(proxy != null) 
      { 
       proxy.Abort(); 
      } 
     } 
    } 
} 

Vous pouvez alors utiliser l'appel comme suit:

ProxyUsing<IMyService>(myService = GetServiceInstance(),() => 
{ 
    myService.SomeMethod(...); 
}); 

L'appel NoInlining est probablement pas important pour vous. J'en ai besoin parce que j'ai un code de journalisation personnalisé qui enregistre la pile d'appels après une exception, il est donc important de conserver cette hiérarchie de méthodes dans ce cas.

+0

Ceci est utile, même si j'espère apprendre quelles exceptions sont dignes d'être attrapées et dans quelles circonstances elles valent la peine – LamonteCristo

Questions connexes