2010-08-31 4 views
1

J'ai un service WCF que j'appelle de manière asynchrone.La liaison WCF personnalisée supprime l'erreur

Si j'appelle une méthode qui lance une exception .Net normale (c'est-à-dire, pas une exception FaultException) à l'aide de wsHttpBinding, mon canal WCF est laissé dans un état défectueux - c'est le comportement attendu.

Cependant, si je l'appelle la même méthode en utilisant une liaison personnalisée:

<customBinding> 
    <binding name="httpCompressed" sendTimeout="00:10:00" receiveTimeout="00:10:00"> 
     <httpTransport maxBufferSize="2147483647" 
      maxBufferPoolSize="524288" 
      maxReceivedMessageSize="2147483647" /> 
    </binding> 
</customBinding> 

Puis, alors que je reçois une exception en arrière, le canal est laissé dans un état ouvert. Ce n'est pas un comportement attendu - du moins pas autant que je puisse le dire.

Cela indique-t-il un bogue dans le customBinding pour WCF? Est-ce réellement un comportement attendu (si oui, une documentation de pointeur serait excellente).

Merci d'avance pour toute assistance.

David Mullin IMA Technologies

Répondre

1

C'est expexted. WsHttpBinding dans le paramètre par défaut (avec session de sécurité) utilise l'instance PerSession. Cela signifie que l'instance de service unique gère toutes les demandes du proxy ouvrant le canal. Si une exception non gérée survient, l'instance de service est détruite et le canal est en défaut. Le proxy ne peut pas ouvrir plus d'un canal et ne peut pas démarrer une autre session. La seule chose que vous pouvez faire avec un proxy défaillant est de l'annuler.

Votre liaison personnalisée utilise un transport HTTP pur sans aucune session. En raison de cela, l'instanciation PerCall est utilisée. Cela signifie que chaque demande de proxy est gérée par une nouvelle instance de service. L'instance de service est libérée après chaque appel et les erreurs n'affectent pas le canal car l'appel suivant sera géré par une nouvelle instance de service.

+0

Hmm. Compte tenu de cela, je me attends à ce que le changement de l'instanciation explicitement mon service comme suit: [ServiceBehavior (InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext = false)] ferait en sorte que, si je wsHttpBinding, je ne finirais plus avec un canal fautif. Ce n'est pas le cas - j'ai essayé toutes les différentes permutations d'instanciation/concurrence, et j'ai toujours le comportement wsHttpBinding, et pas customBinding. –

+1

Ce n'est probablement pas clair d'après ma réponse, mais ce qui compte ici, c'est une session. Même si vous utilisez le mode instance unique dans le service exposé sur votre liaison personnalisée, vous n'avez toujours pas de session. –

Questions connexes