WCF使用KnownType属性

时间:2016-04-20 11:26:32

标签: c# wcf object marshalling

我遇到从WCF服务返回对象的问题。包含一个最小的例子

[ServiceContract]
public interface IService1
{
    [OperationContract]
    object GetObjectData();
}

当GetObjectData()方法返回一个字符串时,一切正常,我的客户端可以读取数据,但是当它返回一个不同的对象时,例如,一个公共程序集中的一个对象:

[DataContract]
[KnownType(typeof(TestObject))]
public class TestObject
{
    [DataMember]
    public string StringProperty { get; set; }

    [DataMember]
    public int IntProperty { get; set; }
}

然后客户端调用webservice方法崩溃。通过在互联网上阅读,KnownType属性(如上所述)应该已经解决了我的所有问题,但我现在从我的客户端收到以下错误。谢谢你的帮助。

{“格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://tempuri.org/:GetObjectDataResult时出错.InstallException消息为'第1行位置错误289.元素'{{3} ''包含映射到名称'http://tempuri.org/:GetObjectDataResult'的类型的数据。反序列化器不知道映射到此名称的任何类型。如果使用DataContractSerializer或添加对应于'的类型,请考虑使用DataContractResolver TestObject'到已知类型列表 - 例如,通过使用KnownTypeAttribute属性或将其添加到传递给序列化程序的已知类型列表。'。请参阅InnerException以获取更多详细信息。“}

1 个答案:

答案 0 :(得分:2)

来自dataFile

您当然可以返回Object并使用KnownType来定义其具体类型,但前提是Object是要返回的具体类型的属性。您必须具有包含该对象的包装类型。

KnownType不适用于从合同调用返回的对象,但适用于从合同调用返回的类型中的不可知类型。将您的Object返回值包装为一个名为...的具体类型,可能是带有对象属性的“GetObjectDataWrapper”。使用KnownType装饰GetObjectDataWrapper。