【问题标题】:WCF generated stub does not generate correct return typeWCF 生成的存根不生成正确的返回类型
【发布时间】:2013-09-12 07:07:14
【问题描述】:

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

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

谢谢

乔纳斯

【问题讨论】:

  • 如何序列化接口?客户端将使用接口做什么(即,它将如何实现它?)接口是一个 OO 概念 - WCF(和 Web 服务)是关于 SOA 的,不了解 OOP。谷歌“从 WCF 返回接口”,你会看到很多关于这个的答案以及为什么它不能完成(或者至少,不是很容易)。
  • 我认为你没有理解我的意思。让我试着更清楚一点。
  • 我认为你没有理解我的意思。让我试着更清楚一点。我不想返回一个接口。但是,我在服务器端使用接口,然后将具体类型告诉序列化程序。我使用我的方法/服务上的属性来做到这一点。这样,序列化程序就知道如何将接口返回类型序列化为具体实现。同样,我帖子中的所有代码都可以正常工作。这样我就可以继续在客户端上使用接口。我希望这足以让您看到这不是序列化问题。
  • 我还是不明白你。 “在服务器端我使用接口作为返回类型” - 这怎么不返回接口? ISomething 是接口吗?如果是,那么Function GetSomething() As ISomething 正在返回一个接口。我没有不同意你的观点——我只是没有看到你似乎想告诉我什么。

标签: .net wcf serialization


【解决方案1】:

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

首先,我猜测您实际上是在从函数生成一个实现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 转换为 ISomething 之外,我看不到任何其他“恢复”智能感知的方法。

【讨论】:

  • 嗨蒂姆,感谢您的回复。我也猜测是这种情况。但是,客户端确实知道具体实现和接口,因为我的客户端通过“在引用的程序集中重用类型”引用和使用这些类型。序列化在“幕后”进行,当然,是在具体类型上完成的。然而,生成的存根可以很好地返回 ISomething,因为返回类型和序列化过程是两件不同的事情(或者至少我希望他们是这样设计的)。到目前为止,我认为这只是另一个设计决定..
  • @Flodpanter - 我认为即使客户端和服务都知道具体的实现和接口,它们可能被视为不同,因为它们位于单独的程序集中.同样,不是 100% 确定 - 我使用 ChannelFactory&lt;T&gt; 和共享程序集 - 很长一段时间没有使用服务引用,所以可能会有一些细微的差异。您能否在代码中验证服务和客户端之间对象的命名空间是否不同?
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多