【发布时间】:2011-09-03 10:19:42
【问题描述】:
我有 WCF 服务。
正常操作会看到服务器执行一些处理,通过回调将填充的 XactTaskIn 对象返回给客户端。我有这个工作正常。
我的问题是,当我尝试将 returnData 变量设置为填充的 XactException 并尝试通过回调将 XactTaskIn 发送回客户端时,我会抛出以下异常。
异常 - “类型 'XactException' 与 数据合同名称 'XactException:http://schemas.datacontract.org/2004/07/' 预计不会。考虑使用一个 DataContractResolver 或添加任何类型 不知道静态的列表 已知类型 - 例如,通过使用 KnownTypeAttribute 属性或通过 将它们添加到已知类型列表中 传递给 DataContractSerializer。” (System.Runtime.Serialization.SerializationException) 异常 消息=“键入'XactException' 数据合同名称 'XactException:http://schemas.datacontract.org/2004/07/' 预计不会。考虑使用一个 DataContractResolver 或添加任何类型 不知道静态的列表 已知类型 - 例如,通过使用 KnownTypeAttribute 属性或通过 将它们添加到已知类型列表中 传递给 DataContractSerializer。", 异常类型 = "System.Runtime.Serialization.SerializationException"
这里是 XactTaskIn 类
[DataContract]
public class XactTaskIn
{
[DataMember]
public DateTime timeOut;
[DataMember]
public DateTime timeIn;
[DataMember]
public string name;
[DataMember]
public string responseTo;
[DataMember]
public String moduleFromName;
[DataMember]
public String moduleFromType;
[DataMember]
public String methodFromName;
[DataMember]
public object[] originalInputs;
[DataMember]
public String returnMethodToCall;
[DataMember]
public String returnModuleToCall;
[DataMember]
public object returnData;
public XactTaskIn(DateTime timeOut, DateTime timeIn, string name, string responseTo, String moduleFromName, String moduleFromType, String methodFromName, object[] originalInputs, String returnMethodToCall, String returnModuleToCall, object returnData)
{
this.timeOut = timeOut;
this.timeIn = timeIn;
this.name = name;
this.responseTo = responseTo;
this.moduleFromName = moduleFromName;
this.moduleFromType = moduleFromType;
this.methodFromName = methodFromName;
this.originalInputs = originalInputs;
this.returnMethodToCall = returnMethodToCall;
this.returnModuleToCall = returnModuleToCall;
this.returnData = returnData;
}
}
这是 XactException 类:
[DataContract]
public class XactException
{
[DataMember]
string message;
public XactException(string message)
{
this.message = message;
// Add implementation.
}
}
更新:
好的,丹尼尔的评论帮助了我。
现在看起来服务器正在向客户端发送回调,但客户端正在抛出以下异常。
- 捕获:“格式化程序在尝试反序列化时抛出异常 消息:有一个错误,而 试图反序列化参数 http://tempuri.org/:taskIn。这 InnerException 消息是“错误 第 1 行位置 960. 元素 'http://schemas.datacontract.org/2004/07/:returnData' 包含来自映射到的类型的数据 名字 'http://schemas.datacontract.org/2004/07/:XactException'。 解串器不知道 映射到此名称的任何类型。 考虑使用 DataContractResolver 或者添加对应的类型 'XactException' 到已知列表 类型 - 例如,通过使用 KnownTypeAttribute 属性或由 将其添加到已知类型列表中 传递给 DataContractSerializer。'。 请参阅 InnerException 了解更多信息 细节。” (System.ServiceModel.Dispatcher.NetDispatcherFaultException) 异常 Message = "格式化程序抛出了一个 尝试反序列化时出现异常 消息:有一个错误,而 试图反序列化参数 http://tempuri.org/:taskIn。这 InnerException 消息是“错误 第 1 行位置 960. 元素 'http://schemas.datacontract.org/2004/07/:returnData' 包含来自映射到的类型的数据 名字 'http://schemas.datacontract.org/2004/07/:XactException'。 解串器不知道 映射到此名称的任何类型。 考虑使用 DataContractResolver 或者添加对应的类型 'XactException' 到已知列表 类型 - 例如,通过使用 KnownTypeAttribute 属性或由 将其添加到已知类型列表中 传递给 DataContractSerializer。'。 请参阅 InnerException 了解更多信息 详细信息。”,异常类型 = "System.ServiceModel.Dispatcher.NetDispatcherFaultException"
【问题讨论】:
-
尝试使用
KnownTypeAttribute,如异常中所述。 -
@Daniel - 我应该把属性放在哪里?
-
@user589195:我想在
XactException类。 -
我在类的开头尝试了这个 [KnownType(typeof(object))]
-
如果你使用
[KnownType(typeof(XactException ))]呢?
标签: c# .net wcf serialization exception-handling