【问题标题】:Automation Error when invoking method on WCF mex Moniker with Excel使用 Excel 在 WCF mex Moniker 上调用方法时出现自动化错误
【发布时间】:2014-12-02 19:09:36
【问题描述】:

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

在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 调用之前有效,这意味着名字对象已成功创建。但是,当我尝试对其调用任何方法时,我会收到一个错误。

WCF 方法与 Microsoft WCF 测试客户端和其他 WCF 客户端完美配合。所以我知道服务本身没有问题。

【问题讨论】:

    标签: wcf excel excel-automation vba


    【解决方案1】:

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

    问题原因

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

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

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

    我的解决方案

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

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

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

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


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

    【讨论】:

    • 这一行救了我:“即使您要调用的方法在其方法参数或返回类型中可能根本没有任何复杂类型,但如果至少有一个方法,它们将无法工作在具有的服务中。”...我从默认生成的 WCF 代码中删除了默认的“复合类型”类,一切正常!太好了!
    猜你喜欢
    • 2021-05-01
    • 2019-10-03
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多