【问题标题】:WCF Service Deserialization failed with DataTable from .NET 4.5 Server to .NET 3.0 ClientWCF 服务反序列化失败,DataTable 从 .NET 4.5 服务器到 .NET 3.0 客户端
【发布时间】:2016-06-01 08:57:54
【问题描述】:

当 WCF 服务返回嵌套在 DataSet 单元格值(而不是表)中的 DataTable 时,客户端的反序列化失败。

我正在查看 Fidder 的流量,发现以下部分:

msdata:InstanceType="System.Data.DataTable, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

这可能会导致反序列化失败,因为 .NET 3.0 不知道这种类型。

有没有人知道如何在不更新客户端 .net 版本的情况下处理这个问题?

谢谢:)

错误信息

值不能为空。参数名称:类型

堆栈跟踪

  Server stack trace: 
     At System.Activator.CreateInstance(Type type, Boolean nonPublic)
     At System.Data.Common.ObjectStorage.ConvertXmlToObject(XmlReader xmlReader, XmlRootAttribute xmlAttrib)
     At System.Data.XmlDataLoader.LoadColumn(DataColumn column, Object[] foundColumns)
     At System.Data.XmlDataLoader.LoadTable(DataTable table, Boolean isNested)
     At System.Data.XmlDataLoader.LoadData(XmlReader reader)
     At System.Data.DataSet.ReadXmlDiffgram(XmlReader reader)
     At System.Data.DataSet.ReadXml(XmlReader reader, XmlReadMode mode, Boolean denyResolving)
     At System.Data.DataSet.ReadXmlSerializable(XmlReader reader)
     At System.Data.DataSet.System.Xml.Serialization.IXmlSerializable.ReadXml(XmlReader reader)
     At System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadIXmlSerializable(XmlSerializableReader xmlSerializableReader, XmlReaderDelegator xmlReader, XmlDataContract xmlDataContract, Boolean isMemberType)
     At System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadIXmlSerializable(XmlReaderDelegator xmlReader, XmlDataContract xmlDataContract, Boolean isMemberType)
     At System.Runtime.Serialization.XmlDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
     At System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader)
     At System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, DataContract& dataContract)
     At System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns)
     At System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName)
     At System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName)
     At System.Runtime.Serialization.DataContractSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName)
     At System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)
     At System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameter(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)
     At System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameters(XmlDictionaryReader reader, PartInfo[] parts, Object[] parameters, Boolean isRequest)
     At System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest)
     At System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest)
     At System.ServiceModel.Dispatcher.OperationFormatter.DeserializeReply(Message message, Object[] parameters)
     At System.ServiceModel.Dispatcher.ProxyOperationRuntime.AfterReply(ProxyRpc& rpc)
     At System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
     At System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
     At System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
     At System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
     At System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

  Exception rethrown at [0]: 
     At System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
     At System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

【问题讨论】:

  • 就我而言,所有表和数据集都有名称。
  • 看看THIS

标签: c# .net wcf


【解决方案1】:

注册AssemblyResolve 解决了这个问题。

我选择了一个与目标程序集同名(无版本)的加载程序集,这很好用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多