我成功创建了一个服务名字作为我的 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 客户端完美配合。所以我知道服务本身没有问题。
对于面临同样问题的任何人,这里是解决方案。我自己通过一些研究发现了问题的原因,下面是我为解决这个问题所做的事情。
问题原因
(看起来)使用 COM 接口(使用名字字符串连接到 WCF 服务)的程序在复杂类型(如类、结构、数组等)方面存在问题。它们只能使用简单类型(如字符串、整数、小数、布尔值等)。
方法参数或返回类型中的复杂类型不起作用。
即使您要调用的方法在其方法参数或返回类型中可能根本不具有任何复杂类型,但如果服务中至少有一个方法具有复杂类型,它们也将不起作用。
就我而言,我感兴趣的方法没有任何复杂类型作为方法参数或返回类型。
我的解决方案
一旦我找出了导致问题的原因,找到解决方案就很容易了。我刚刚为我感兴趣的方法创建了一个单独的 WCF 服务(接口),并确保没有公开公开的复杂类型,即方法定义中没有复杂类型 - 方法参数和返回类型。
接下来,我创建了一个实现此接口的类,就像任何其他 WCF 服务一样。我从原始类派生了此类,因此不需要重复其中实现的所有业务逻辑。这门课解决的唯一目的是克服我面临的限制。它只是原始类的包装,其中的方法数量有限。这些方法只是调用基类的等效方法并将结果输出直接返回给客户端。
然后我修改了我的app.config
文件来托管这个新服务,然后用这个新服务地址替换名字字符串中的服务地址。因此,基本上我最终托管了两个 WCF 服务 - 一个用于可以使用复杂类型的客户端,另一个用于不能使用复杂类型的客户端。
这就是所需要的一切,现在一切都工作得很好。 :)
NOTE这只是基于我自己的观察,我可能是错的。我可能会遗漏一些东西,并且可能有更好的方法来解决这个问题。如果您发现这种情况,请随时发表评论或发布您的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)