WCF生成的存根不会生成正确的返回类型

时间:2013-09-12 07:07:14

标签: .net wcf serialization

我有一个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)

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

由于

纳斯

1 个答案:

答案 0 :(得分: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,除了将Object转换为{之外,我没有看到任何其他方式来“恢复”智能感知{1}}。