2010-11-13 38 views
0

Je suis en train de mettre en place un service WCF en utilisant net.tcp et netTcpBinding pour obtenir des communications duplex avec mon client Silverlight. J'appelle le service à partir de l'application Silverlight et le service appelle un autre serveur en lui transmettant une méthode de rappel dans la classe de service WCF. Le serveur distant rappelle plusieurs fois et chaque fois qu'il le fait, le service WCF utilise callbackchannel pour envoyer les données au client Silverlight. Tout fonctionne bien la plupart du temps.Comment puis-je vérifier que la connexion est toujours valide pour le client Silverlight utilisant net.tcp pour le duplex?

Si l'utilisateur envoie une grosse requête, j'obtiens une exception TimeoutException après qu'un grand nombre de rappels aient déjà fonctionné. (Clairement, il y a du travail à faire ailleurs pour éviter cela, mais je voudrais d'abord essayer de le faire.)

Je m'attendais à faire une sorte de vérification 'if (client.ConnectionState == faulted)' avant essayer de rappeler au client Silverlight mais je n'arrive pas à trouver l'objet qui contient l'état de la connexion. Est-ce qu'il y a un? Est-ce que je m'approche de cela du mauvais côté?

Ceci est ma première entreprise dans un service net.tcp et duplex. Je viens de déménager et ma bible WCF est toujours dans une boîte. Quelque part. :-) Donc, je ne peux pas faire ma lecture d'arrière-plan habituelle.

Tous les pointeurs seraient reçus avec reconnaissance. Voici un code nu dans le cas où ma description est trop soupy:

private IActiveDirectoryClient client; 
    private AsyncSearchRunner runner; 

    public void Search(Request request) 
    { 
     this.client = OperationContext.Current.GetCallbackChannel<IActiveDirectoryClient>(); 

     runner = new AsyncSearchRunner(); 
     runner.Run(request.SearchRoot, request.SearchFilter, request.PageSize, 
      System.DirectoryServices.Protocols.SearchScope.Subtree, SendObjects); 
    } 

    private void SendObjects(List<DirectoryObject> items) 
    { 
     Response response = new Response(); 
     response.DirectoryObjects = items.ToArray(); 

     client.SendResponse(response); 
    } 

Répondre

0

Oui, il y a une propriété State qui est définie dans la classe ClientBase<> (toutes les classes proxy sont dérivées de ClientBase<>).

Il existe des wrappers proxy qui gèrent les états d'erreur de la connexion et rétablissent les connexions si nécessaire. Google pour "wcf proxy wrapper".

Vous pouvez aussi brasser quelque chose à la maison si vous utilisez un modèle de ServiceLocator.