什么会导致WCF服务返回“对象”类型的对象

时间:2009-07-30 12:52:22

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

根据我关于WCF service return values的其他帖子,我正在使用其他公司的Web服务,当我在Visual Studio中添加服务引用时,该方法的返回值是类型为{{1的对象}}

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

我是否遗漏了某些内容,或者代理类是否应该返回类型值?

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

更新:

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

3 个答案:

答案 0 :(得分:4)

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

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

[DataContract]
public class MyConcreteClass : IMyInterface {
}

我没有亲自尝试使用接口,但我已经尝试了一个抽象基类,它工作正常。当客户端收到返回值时,它可以成功地向下转换为派生类。

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

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

答案 1 :(得分:1)

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

Visual Studio“添加服务引用”工具和svcutil.exe非常擅长生成代理类,但它们并不完美。他们生成的文件是您修改的文件,我建议您只需修改操作即可返回正确的数据合同。

答案 2 :(得分:1)

从WCF使用java Web服务时遇到了类似的问题。

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

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

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