8

contact という名前の 1 つの抽象クラスと、contact を継承する client という別のクラスがあります。type contact のパラメーターを受け取るメソッドを使用して、WCF サービスを扱っています。ただし、私が持っているのは、渡したいクライアントのインスタンスです。私はこのエラーに直面しています:

データ コントラクト名が「Client:http://schemas.datacontract.org/2004/07/xxx」の「xxx.Client」と入力することは想定されていません。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加することにより、静的に認識されていない型を既知の型のリストに追加します。

4

3 に答える 3

7

ClientaがのタイプであることをDataContractSerializerに通知する必要がありContactます。

これを行うにはいくつかの方法がありますが、それらはすべて、1KnownTypeつまたは複数のServiceKnownType属性の使用を中心に展開します。

KnownTypeをクラスに配置して、DataContractSerializerClientにKnownTypeであることを通知できますContact

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

をクラスに配置して、このKnownTypeクラスをシリアル化するときに、この他のクラスにも遭遇する可能性があることを示すこともできます。

実際に:を含む可能DataContract性のあるプロパティを持つクラスがある場合は、これを実行することをお勧めします。ContactClient

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

この場合、クライアントで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は、どのメソッドもタイプのタイプを返す可能性があることを認識しますClient。既知のタイプと同様に、静的メソッドを使用してサービスの既知のタイプを提供することもできます。

于 2012-05-15T14:52:08.207 に答える
5

WCFは抽象クラスでは直接機能しません。datacontractまたはserviceクラスで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 に答える