【问题标题】:What would cause a WCF service to return an object of type "object"什么会导致 WCF 服务返回“对象”类型的对象
【发布时间】:2009-07-30 12:52:21
【问题描述】:

根据我关于WCF service return values 的另一篇文章,我正在使用另一家公司的Web 服务,当我在Visual Studio 中添加服务引用时,该方法的返回值是object 类型的对象。

Web 服务的作者向我展示了代码,它实际上返回了一个类型化对象。

是我遗漏了什么,还是代理类应该返回一个类型化的值?

是否有生成代理类或实际服务的设置?

更新:

我查看了 WCF 服务背后的实际类,并意识到服务方法的返回值实际上是返回一个具体类型实现的接口。具体类型用 [DataContract] 属性(和适当的 [DataMember] 属性)标记,但接口没有这样的属性。这会导致服务将返回类型设置为对象吗?

【问题讨论】:

  • 我的更新有任何接受者吗?
  • 您仍然需要显示一些代码。在服务合同中显示操作的签名。
  • 您没有回复有什么原因吗?

标签: c# asp.net wcf return-value proxy-classes


【解决方案1】:

假设您是服务开发人员,您可以使用KnownTypeAttribute

[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}

[DataContract]
public class MyConcreteClass : IMyInterface {
}

我没有亲自尝试过使用接口,但我已经尝试过使用抽象基类并且效果很好。客户端收到返回值后,就可以成功向下转型到派生类了。

可能是服务代码确实这样做了,问题在于svcutil.exe 没有足够准确地生成代理类。

虽然您无法控制服务代码,但您可以控制客户端代理代码。您可以尝试手动编辑svcutil.exe 给您的代理类以自己添加KnownTypeAttribute。通过这样做,您最终控制了 DataContractSerializer 的行为,只要您注意不要错误地更改数据的有线格式,它应该仍然可以工作。

【讨论】:

    【解决方案2】:

    代理类是一个生成的文件,因此它可能包含错误。如果您有数据合同的副本,您可以随意更改代理类以使用正确的类型而不是 System.Object,并且一切都应该正常工作。

    Visual Studio“添加服务引用”工具和svcutil.exe 非常擅长生成代理类,但它们并不完美。他们生成的文件是您自己修改的,我鼓励您简单地修改操作以返回正确的数据协定。

    【讨论】:

    • 但是如果我手动更改自动生成的代理类,然后更新服务它会覆盖我的更改,对吧?
    • 代理类好像是分部类。所以我可以通过这种方式进行更改。
    • 你不能用部分类来改变它——你需要改变代理本身。如果没有测试,我无法确定服务更新是否会覆盖您的更改,但即便如此,修复它也很简单,而且它会是一个很容易被发现的编译错误。
    • 我刚刚对这个问题所做的更新呢,界面会不会是罪魁祸首?
    【解决方案3】:

    我们在使用 WCF 的 java web 服务时遇到了类似的问题。

    在我们的例子中,它所返回的类型是实际返回的有限版本。

    对我们有用的是将对象转换为预期的类型。之后数据就可用了。

    因此,要解决您的问题,您可以尝试将对象强制转换为预期的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 2010-11-25
      相关资源
      最近更新 更多