我有一个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.
任何人都可以建议我这个错误的解决方案是什么?
考虑序列化具体类.您无法序列化接口.请参阅此答案:https://stackoverflow.com/a/4659289/860243
我从bing中找到了一些有用的链接:
上面的文章讨论了您的情况以及使用[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而不是每个操作合同.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
5099 次 |
| 最近记录: |