概要

既知のデータ コントラクト型

サービス間でデータを通信するときにデータが既知の型ではない場合、下記の 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>


フレッツ光が月額556円~【GMOとくとくBB】

コメント:



(画像の文字列を入力して下さい)

トップ   編集 凍結 差分 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019/12/02 (月) 12:44:11 (1628d)

PCpዾyǗlgĂ܂}WŔ܂z 萔O~ył񂫁z Yahoo yV NTT-X Store

z[y[W ̃NWbgJ[h COiq ӂ邳Ɣ[ COsیI COze