2014-09-09 1 views
5

Я успешно создал провизор сервиса как клиент для моей службы WCF. Но я не могу назвать какой-либо метод на прозвище.Ошибка автоматизации при вызове метода в WCF mex Moniker с Excel

В конце службы WCF У меня есть фиктивный метод, названный TestMethod, следующим образом:

Public Function TestMethod(ByVal TestValue As String) As String Implements ICustomerService.TestMethod 
     Return "You said.... " & TestValue 
    End Function 

Следующий код создает прозвища в Excel.

Public Sub WCFMexMonkierDemo() 
    ' Create a string for the service moniker including the content of the WSDL contract file 
    Dim mexMonikerString As String 
    mexMonikerString = "service:mexAddress='http://localhost/CustomerService.svc/mex'" & _ 
         ", address='http://localhost/CustomerService.svc'" & _ 
         ", binding=CustomerServices.CustomerService" & _ 
         ", bindingNamespace='http://tempuri.org/'" & _ 
         ", contract=ICustomerService" & _ 
         ", contractNamespace='http://tempuri.org/'" 

    ' Create the service moniker object 
    Dim mexMoniker, result 
    Set mexMoniker = GetObject(mexMonikerString) 

    result = mexMoniker.TestMethod("client call")  '<-- error on this line 
    'Set result = mexMoniker.TestMethod("client call") 
    MsgBox result 

    Set mexMoniker = Nothing 
    Set result = Nothing 
End Sub 

Приведенный выше код работает до величин GetObject вызова, который подразумевает, что кличка успешно создан. Но я получаю сообщение об ошибке, как только пытаюсь называть любой метод.

Automation Error

метод WCF отлично работает нормально с клиентом Microsoft WCF Test, и других клиентов WCF. Поэтому я знаю, что с самой услугой нет проблем.

ответ

1

Для тех, кто сталкивается с той же проблемой, вот решение. Я сам выяснил причину проблемы, немного исследовав, а ниже - то, что я сделал, чтобы обойти это.

Причина Проблема

(Похоже) программы, использующие COM интерфейсы, используя строку прозвище для подключения к службам WCF имеют проблемы со сложными типами (например, классы, структуры, массивы и т.д.). Они могут работать только с простыми типами (например, строковыми, целочисленными, десятичными, булевыми и т. Д.). Сложные типы в аргументах метода или в возвращаемом типе не работают.

Даже если метод, который вы хотите вызвать, может не иметь каких-либо сложных типов в своих аргументах метода или возвращаемом типе, они не будут работать, если в службе есть хотя бы один метод.

В моем случае методы, которые меня интересовали, не имели сложных типов в качестве аргументов метода или возвращаемых типов.

мое решение

После того, как я узнал, что вызывает проблемы, найти решение вокруг него было легко. Я только что создал отдельный WCF-сервис (интерфейс) для моих собственных интересов и обеспечил, чтобы не существовало сложных типов, открытых публично, т. Е. Не было сложных типов в определении метода - аргументах метода и типах возврата.

Далее я создал класс, который реализует этот интерфейс, как и любой другой службы WCF. Я вывел этот класс из оригинального, так что мне не нужно повторять всю бизнес-логику, реализованную там. Единственная цель, которую решает этот класс, - это преодолеть ограничение, с которым я столкнулся. Это была всего лишь обертка вокруг исходного класса с ограниченным количеством методов. Методы просто называются эквивалентным методом базового класса и возвращают полученный результат непосредственно клиенту.

Затем я модифицировал свой файл app.config для размещения этой новой службы, а затем заменил служебный адрес в строке имени этого нового служебного адреса. Итак, в основном я закончил размещение двух служб WCF - один для клиентов, которые могут потреблять сложные типы, а другой для тех, кто не может.

Это все, что требовалось, и все работает отлично.:)


ПРИМЕЧАНИЕ, что это только на основе моего собственного наблюдения, и я могу ошибаться. Возможно, что-то может быть что-то, чего я могу пропустить, и могут быть лучшие способы обойти эту проблему. Если вы обнаружите, что это так, не стесняйтесь комментировать или публиковать свое решение.