У меня есть служба WCF (одна и та же), работающая на нескольких серверах, и я хотел бы вызывать все экземпляры параллельно с одного клиента. Я использую ChannelFactory и интерфейс (контракт) для вызова сервиса. У каждой службы есть локальный клиент <endpoint>
, определенный в файле .config.
То, что я пытаюсь сделать, - это создать некую общую структуру, чтобы избежать дублирования кода.
Например, синхронный вызов в одном потоке выглядит примерно так:
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
Часть, с которой я испытываю затруднения, состоит в том, как указать и фактически вызвать фактический удаленный метод (например, «TestRemote») без необходимости дублировать вышеупомянутый код, и все связанные с потоками вещи, которые вызывают это, для каждого метода .
В конце я хотел бы иметь возможность писать код в виде строк (рассмотрим этот код псевдо):
Dim results as Dictionary(Of Node, ExpectedReturnType)
results = ParallelInvoke(IMyService.SomeMethod, parameter1, parameter2)
где ParallelInvoke () будет принимать метод в качестве аргумента, а также параметры (paramArray или object () .. все что угодно) и затем выполнять запрос на каждом удаленном узле, блокировать, пока все они не вернут ответ или тайм-аут , а затем вернуть результаты в словарь с ключом в качестве узла и значением в качестве любого значения, которое он вернул.
Затем я могу (в зависимости от метода) выбрать нужное мне значение или собрать все значения с каждого сервера вместе и т. Д.
Я почти уверен, что могу сделать это с помощью отражений и InvokeMember (), но это требует передачи метода в виде строки (что может привести к ошибкам, таким как вызов несуществующего метода, который не может быть перехвачен во время компиляции ), поэтому я хотел бы посмотреть, есть ли более чистый способ сделать это.
Спасибо