InnerException消息是'在传递给W服务时键入包含数据协定名称

Bhu*_*van 3 wcf

我有一个WCF服务,其运营合同为

void AddQuery(IQuery Query);
Run Code Online (Sandbox Code Playgroud)

我的智商是这样的

public interface IQuery
{
    Guid                Id { get; set; }        
    string              QueryNo { get; set; }
    string              Status { get; set; }
    IData               data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并且IQuery的实现在

[Serializable]
public class Query : IQuery
{
    Guid                Id { get; set; }        
    string              QueryNo { get; set; }
    string              Status { get; set; }
    IData               data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我试图从客户端发送我的对象时

  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)
      {
      }
  }
Run Code Online (Sandbox Code Playgroud)

但我得到一个例外

尝试序列化参数时出错.InnerException消息是'Type'ViewModels.Query',数据协定名称为'Query:http://schemas.datacontract.org/2004/07/ViewModels '不是预期的.考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.有关更多详细信息,请参阅InnerException.

任何人都可以建议我这个错误的解决方案是什么?

Flo*_*ing 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;}
}
Run Code Online (Sandbox Code Playgroud)

您的Query类使用Data contract serializer实现您的界面 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
}
Run Code Online (Sandbox Code Playgroud)

并为您的服务合同:

[ServiceContract]
public interface IMyQueryService
{
      [OperationContract]
      [ServiceKnownType(typeof(Query))]
      void AddQuery(IQuery query);
}
Run Code Online (Sandbox Code Playgroud)

[ServiceKnownType(typeof(Query))]将使您的操作合同允许Query作为输入.另请注意,您需要指定IQuery需要作为参数传递给具有ServiceKnownType属性的Operation合约的所有实现.

此外,如果您希望多个(或所有)操作合同将它们作为参数,请分别指定ServiceKnownType属性ServiceContract而不是每个操作合同.

希望这可以帮助!