5

我成功地为我的 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调用之前有效,这意味着名字对象已成功创建。但是,一旦我尝试调用任何方法,我就会收到错误消息。

自动化错误

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

4

1 回答 1

2

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

问题原因

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

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

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

我的解决方案

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

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

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

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


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

于 2014-12-02T11:03:34.907 回答