J'ai un service WCF (le même) qui s'exécute sur plusieurs serveurs, et je voudrais appeler toutes les instances en parallèle à partir d'un seul client. J'utilise ChannelFactory et l'interface (contrat) pour appeler le service. Chaque service a un client local <endpoint>
défini dans le fichier .config. Ce que j'essaye de faire est de construire une sorte de cadre générique pour éviter la duplication de code.Appels WCF parallèles sur plusieurs serveurs
Par exemple, un appel synchrone dans un seul thread ressemble à quelque chose comme ceci:
Dim remoteName As String = "endpointName1"
Dim svcProxy As ChannelFactory(Of IMyService) = New ChannelFactory(Of IMyService)(remoteName)
Try
svcProxy.Open()
Dim svc As IMyService = svcProxy.CreateChannel()
nodeResult = svc.TestRemote("foo")
Finally
svcProxy.Close()
End Try
La partie que je vais avoir du mal à comment spécifier et appeler en fait la méthode à distance réelle (par exemple « TestRemote ») sans avoir à dupliquer le code ci-dessus, et toutes les choses liées au thread qui invoquent cela, pour chaque méthode.
En fin de compte, je voudrais être en mesure d'écrire du code le long des lignes de (considérer ce pseudo-code):
Dim results as Dictionary(Of Node, ExpectedReturnType)
results = ParallelInvoke(IMyService.SomeMethod, parameter1, parameter2)
où ParallelInvoke() prendra la méthode comme argument, aussi bien comme les paramètres (paramArray ou object() .. quel que soit), puis allez exécuter la requête sur chaque nœud distant, bloquer jusqu'à ce qu'ils retournent tous une réponse ou un délai, puis renvoyer les résultats dans un dictionnaire avec la clé comme nœud, et la valeur comme n'importe quelle valeur renvoyée.
Je peux ensuite (selon la méthode) choisir la seule valeur que j'ai besoin, ou agréger toutes les valeurs de chaque serveur ensemble, etc.
Je suis sûr que je peux le faire en utilisant la réflexion et InvokeMember(), mais cela nécessite de passer la méthode sous la forme d'une chaîne (ce qui peut conduire à des erreurs comme appeler une méthode non existante qui ne peut pas être interceptée à la compilation), donc j'aimerais voir s'il existe une méthode plus propre fais ceci.
Merci
Vous ne savez pas exactement ce que vous voulez faire, mais vous pouvez examiner les proxies côté client générés par svcutil WCF et vous verrez comment vous pouvez programmer à un niveau inférieur pour appeler des services en passant des noms comme "TestRemote". Si vous voulez spécifiquement éviter cela, utiliser la réflexion fonctionnera, et cela ne nécessite pas de passer des chaînes littérales.vous pouvez interroger le proxy côté client pour voir quelles méthodes sont disponibles et les appeler de cette façon. – Cheeso