3

私は操作契約を持つWCFサービスを持っていました

void AddQuery(IQuery Query);

私のIQueryはこのようなものです

public interface IQuery
{
    Guid                Id { get; set; }        
    string              QueryNo { get; set; }
    string              Status { get; set; }
    IData               data { get; set; }
}

そしてIQueryの実装は

[Serializable]
public class Query : IQuery
{
    Guid                Id { get; set; }        
    string              QueryNo { get; set; }
    string              Status { get; set; }
    IData               data { get; set; }
}

クライアントからオブジェクトを送信しようとしているとき

  public void AddQuery(IQuery query)
  {
      try
      {
          // I am sure that the query object is not null and it is implemented
          objServiceClient.AddEnquiry(query);
      }
      catch (Exception ex)
      {
      }
  }

しかし、私は例外を取得しています

パラメータ のシリアライズ中にエラーが発生しました。InnerException メッセージは、「タイプ 'ViewModels.Query' データ コントラクト名 'Query: http://schemas.datacontract.org/2004/07/ViewModels ' は想定されていません」でした。DataContractResolver の使用を検討するか、既知の型のリストに静的に認識されていない型を追加します。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加します。詳細については、InnerException を参照してください。

このエラーの解決策を教えてください。

4

1 に答える 1

5

具体的なクラスをシリアル化することを検討してください。インターフェイスをシリアル化することはできません。この回答を参照してください: https://stackoverflow.com/a/4659289/860243

bing から見つけた便利なリンク:

http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/

上記の記事では、状況と[KnownType]派生クラスの使用例について説明しています

アップデート:

このリンクに基づいて、以下の更新を確認してください。

public interface IQuery 
{ 
    Guid Id { get; set; }
    string QueryNo{ get; set; } 
    string Status { get; set; } 
    IData data {get; set;}
}

インターフェイスを実装するデータ コントラクト シリアライザーを使用する Query クラスIQuery

[DataContract]
public class Query : IQuery
{
    [DataMember]
    public Guid Id { get; set; };
    [DataMember]
    public string QueryNo { get; set; };
    [DataMember]
    public string Status { get; set; };
    [DataMember]
    public Data data { get; set; }; //Make sure you serialize Data class as well
}

サービス契約の場合:

[ServiceContract]
public interface IMyQueryService
{
      [OperationContract]
      [ServiceKnownType(typeof(Query))]
      void AddQuery(IQuery query);
}

これ[ServiceKnownType(typeof(Query))]により、操作コントラクトが入力として許可Queryされます。また、 attributeIQueryを使用して Operation コントラクトにパラメーターとして渡す必要があるすべての実装を指定する必要があることに注意してください。ServiceKnownType

また、複数 (またはすべて) の操作コントラクトがそれらをパラメーターとして受け取るようにする場合は、各操作コントラクトの代わりにServiceKnownType属性を個別に指定します。ServiceContract

お役に立てれば!

于 2013-02-04T16:21:54.293 に答える