0

我有一个 WCF 客户端-服务器设置。在服务器端,我在我的服务方法中使用接口作为返回类型,然后使用<ServiceKnownTypeAttribute>. 所有这一切都很好。

但是,有一个问题非常烦人。当我向客户端添加服务引用时,生成的存根方法的返回类型均为object. 因此,我的客户端上不再存在 Intellisense。我完全能够使用返回值并且可以访问属性,但我必须进行强制转换才能“恢复”智能感知。

例子:

服务器方法:

<OperationContract()>
<ServiceKnownTypeAttribute(GetType(Something))>
Function GetSomething() As ISomething Implements Iservice.GetSomething

生成的存根:

Function GetSomething() As Object Implements Iservice.GetSomething

客户端代码(必须在此处强制转换,因为存根返回类型是对象):

Dim s As ISomething= CType(client.GetSomething(), ISomething)

我是否遗漏了什么,或者这只是正常的行为。由于对象可以序列化并且一切正常,我无法理解为什么我的存根不是特定类型的。

谢谢

乔纳斯

4

1 回答 1

0

我想我明白发生了什么,我会尝试给出解释,尽管其中一些是有根据的猜测。

首先,我将猜测您实际上是在生成一个ISomething从函数实现的具体类型,但您返回的是接口而不是对象。假设MySomething实现ISomething,它可能看起来像这样:

Function GetSomething() As ISomething Implements Iservice.GetSomething

    ' code to create the object
    Return MySomething
End Function

如果您要在控制台应用程序中调用它,您可能会这样做:

Dim MySomething As ISomething = GetSomething()

现在这里是我做出有根据的猜测的地方。

WCF 将根据服务合同的接口生成代理。由于服务契约的操作契约返回的是一个接口而不是一个具体的类,它用于Object生成一个具体的实现,以便可以通过网络对数据进行序列化。

由于客户端不知道Object在这种情况下正在实施ISomething,因此除了强制转换ObjectISomething.

于 2013-09-13T04:28:19.690 回答