8

我有一个名为contact 的抽象类和另一个从contact 继承的名为client 的类。我正在处理一个 WCF 服务,该方法采用一个类型为联系的参数的方法。但是我拥有的是我想要传递的客户端实例。我面临这个错误:

不需要输入数据合同名称为“Client:http://schemas.datacontract.org/2004/07/xxx”的“xxx.Client”。将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。

4

3 回答 3

7

您需要让 DataContractSerializer 知道 aClientContact.

有几种方法可以做到这一点,但它们都围绕着使用一个KnownType或多个ServiceKnownType属性。

KnownType可以放在类上Client告诉 DataContractSerializer 它是一个 KnownType Contact

[DataContract]
[KnownType(typeof(Client))]
public class Contact{}

也可以放在一个类上,KnownType以表明在序列化这个类时你也可能遇到这个其他类。

DataContract如果你有一个类的属性是 a Contact,实际上可能包含 a ,你可能想要这样做Client

[DataContract]
[KnownType(typeof(Client))]
public class Meeting
{
    Contact MeetingContact{get;}
}

在这种情况下,您无需在客户端上指定 KnownType 就可以逃脱。如果您有一个返回集合的属性并且您想指定可以在集合中的类型,您可能还想这样做。

您可以不指定 KnownType 的实际类型,而是指定将返回已知类型的静态方法的名称:

[DataContract]
[KnownType("GetKnownTypes")]
public class Meeting
{
    Contact MeetingContact{get;}

    private static Type[] GetKnownType()
    {
    return new Type[]{typeof(Client)};
    }
}

也可以通过配置文件指定已知类型。

ServiceKnownTypes 以类似的方式工作,但在服务本身上指定:

[ServiceKnownType(typeof(Client))]
[ServiceContract()]
public interface IMyServiceContract
{

    [OperationContract]
    Contact GetContact();
}

此设置将使 DataContactSerializer 知道任何方法都可能返回 type 类型Client。以与已知类型类似的方式,您还可以使用静态方法来提供已知类型的服务。

于 2012-05-15T14:52:08.207 回答
5

WCF 不直接作用于抽象类。您应在数据合同或服务类上使用 KnownType 属性。以下是示例;

[DataContract]
[KnownType(typeof(Client))]
public class Contact
{
   ...
}

[ServiceContract]
[ServiceKnownType(typeof(Client))]
public interface IMyService
{
    contact getcontact(Guid id);
}
于 2012-05-15T14:51:29.070 回答
2

使用[KnownType][ServiceKnownType]属性来确保关系。

于 2012-05-15T14:50:48.807 回答