我有一个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)
我错过了什么或者这只是正常行为。由于对象可以序列化并且一切正常,我无法理解为什么我的存根不是特定于类型的。
由于
纳斯
答案 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}}。