gpt4 book ai didi

wcf - InnerException 消息是“在传递给 W 服务时使用数据协定名称键入

转载 作者:行者123 更新时间:2023-12-01 23:24:40 25 4
gpt4 key购买 nike

我有一个带有操作契约(Contract)的 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)
{
}
}

但是我遇到了一个异常(exception)

There was an error while trying to serialize parameter . The InnerException message was 'Type 'ViewModels.Query' with data contract name 'Query:http://schemas.datacontract.org/2004/07/ViewModels' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.'. Please see InnerException for more details.

谁能建议我如何解决这个错误?

最佳答案

考虑序列化具体类。您不能序列化接口(interface)。引用这个答案:https://stackoverflow.com/a/4659289/860243

我从 bing 找到的一些有用的链接:

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

上面的文章讨论了你的情况和使用[KnownType]作为派生类的例子

更新:

基于此link ,请检查以下更新:

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

您的 Query 类使用数据协定序列化程序实现您的接口(interface) 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
}

对于您的服务契约(Contract):

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

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

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

希望这对您有所帮助!

关于wcf - InnerException 消息是“在传递给 W 服务时使用数据协定名称键入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14690783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com