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

Pra*_*mar 5 excel wcf vba excel-vba excel-automation

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

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

    Public Function TestMethod(ByVal TestValue As String) As String Implements ICustomerService.TestMethod
        Return "You said.... " & TestValue
    End Function
Run Code Online (Sandbox Code Playgroud)

以下代码在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
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于GetObject调用,这意味着成功创建了名字对象.但是一旦我尝试调用任何方法,我就会收到错误.

自动化错误

WCF方法与Microsoft WCF测试客户端和其他WCF客户端完全正常.所以我知道服务本身没有问题.

Pra*_*mar 2

对于面临同样问题的任何人,这里是解决方案。我自己通过一些研究发现了问题的原因,下面是我为解决这个问题所做的事情。

问题原因

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

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

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

我的解决方案

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

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

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

这就是所需要的一切,现在一切都工作得很好。:)


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