使用Excel在WCF mex Moniker上调用方法时出现自动化错误

时间:2014-09-09 12:36:55

标签: excel wcf excel-vba excel-automation vba

我成功创建了一个服务名字对象作为我的WCF服务的客户端。但是我无法在绰号上调用任何方法。

在WCF服务端,我有一个名为TestMethod的虚拟方法,如下所示:

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

以下代码在Excel中创建Moniker。

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测试客户端和其他WCF客户端完全正常。所以我知道服务本身没有问题。

1 个答案:

答案 0 :(得分:2)

对于遇到同样问题的任何人,这是解决方案。我通过一些研究找到了问题的原因,下面是我为解决这个问题所做的工作。

问题原因

(似乎)使用使用名字对象字符串连接到WCF服务的COM接口的程序存在复杂类型(如类,结构,数组等)的问题。它们只能用于简单类型(如字符串,整数,小数,布尔等)。 方法参数或返回类型中的复杂类型不起作用。

即使您要调用的方法在其方法参数或返回类型中根本没有任何复杂类型,如果服务中至少有一个方法,它们将无法工作。

就我而言,我感兴趣的方法没有任何复杂的类型作为方法参数或返回类型。

我的解决方案

一旦我发现造成问题的原因,找到解决方案很容易。我刚刚为我感兴趣的方法创建了一个单独的WCF服务(接口),并确保没有公开暴露的复杂类型,即方法定义中没有复杂类型 - 方法参数和返回类型。

接下来,我创建了一个实现此接口的类,与任何其他WCF服务一样。我从原来的类派生了这个类,所以我不需要重复那里实现的所有业务逻辑。这个课程解决的唯一目的是克服我所面临的限制。它只是原始类的包装器,其中包含有限数量的方法。这些方法简单地调用基类等效方法,并将结果输出直接返回给客户端。

然后我修改了我的app.config文件来托管这个新服务,然后用这个新的服务地址替换了moniker字符串中的服务地址。所以,基本上我最终托管了两个WCF服务 - 一个用于可以使用复杂类型的客户端,另一个用于那些不能使用复杂类型的客户端。

这就是所需要的,现在一切正常。 :)


注意这只是基于我自己的观察,我可能是错的。我可能会遗漏一些东西,可能有更好的方法来解决这个问题。如果您发现是这种情况,请随时发表评论或发布您的解决方案。