既知のデータ コントラクト型 サービス間でデータを通信するときにデータが既知の型ではない場合、下記の CommunicationException 例外が発生します。 基礎になる接続が閉じられました: 接続が予期せずに閉じられました ServiceKnownTypeAttribute または KnownTypeAttribute どちらで設定します。 利用する場面 †たとえば、下記のデータコントラクトを定義しています。 [DataContract] public class Customer { [DataMember] public int CustomerID { get; set; } } [DataContract] public class PersonalCustomer : Customer { [DataMember] public string Name {get;set;} } サービスに下記のサービスコントラクトを定義します。 public Customer GetCustomer(int value) { return new PersonalCustomer(); } ビルドには問題ないはずですが、クライアント側の呼び出しに例外が発生します。このエラーを回避するため、後述のように、既知の型を追加する必要があります。 既知の型を追加する †前述のエラーを回避するため、下記のように、「Customer」クラスに「KnownType」属性を明示的に定義する必要があります。 [DataContract] [KnownType(typeof(PersonalCustomer))] public class Customer { [DataMember] public int CustomerID { get; set; } } 型が多い場合、下記のように、型を配列に一箇所にまとめることができます。ジェネリックの型も、ここに追加することができます。 [DataContract] [KnownType("GetKnownTypes")] public class Customer { [DataMember] public int CustomerID { get; set; } public static Type[] GetKnownTypes() { Type[] t = new Type[2]; t[0] = typeof(PersonalCustomer); t[1] = typeof(CompanyCustomer); return t; } } Web.Config ファイル内でも設定できます。 <system.runtime.serialization> <dataContractSerializer> <declaredTypes> <add type="WcfService.Customer, WcfService, Version=2.0.0.0, Culture=neutral,PublicKeyToken=null" > <knownType type="WcfService.PersonalCustomer, WcfService, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" /> </add> </declaredTypes> </dataContractSerializer> </system.runtime.serialization> 月額たった 1,050円で始められる本格的なお店のホームページ! コメント: |