3

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

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

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

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

更新:

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

4

3 回答 3

5

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

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

[DataContract]
public class MyConcreteClass : IMyInterface {
}

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

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

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

于 2009-08-05T16:12:56.730 回答
1

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

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

于 2009-07-30T12:55:18.560 回答
1

从 WCF 使用 Java Web 服务时,我们遇到了类似的问题。

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

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

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

于 2009-08-09T17:51:20.097 回答