当前位置: 首页 > 编程语言 > C#

使用基类作为WCF服务的参数分享

时间:2023-04-10 12:54:40 C#

C#使用基类作为WCF服务的参数我有一个多项目的解决方案。一个项目提供了一个包含多个类的DLL。其中一个类是WorkerTemplate。另外两个类继承自它,即ExecSQLWorker和CopyWorkerclassExecSQLWorker:WorkerTemplate{};类CopyWorker:WorkerTemplate{};在我的WCF服务中,我有我的接口:publicinterfaceIPQWService{[OperationContract]voidEnqueueWorker(WorkerTemplate[]worker);现在,在我的客户端应用程序中,WorkerTemplate[]由ExecSQLWorker和CopyWorker对象组成。当我现在尝试调用EnqueueWorker(worker)方法时,我收到一条错误消息,告诉我序列化工作类时出现问题。所以我猜是因为服务确实序列化基类有问题,而不是获取继承类。但如何轻松解决这个问题?InnerException消息是“类型‘DV_BII30.ExecSQLWorker’,数据协定名称‘ExecSQLWorker:http://schemas.datacontract.org/2004/07/DV_BII30’不是预期的。如果您正在使用DataContractSerializer或将任何静态未知类型添加到已知类型列表中,请考虑使用DataContractResolver-例如,通过使用KnownTypeAttribute属性或将它们添加到传递给序列化程序的已知类型列表中。有关详细信息,请参阅InnerException。--->System.Runtime.Serialization.SerializationException:类型'DV_BII30.ExecSQLWorker'数据协定名称为'ExecSQLWorker:http://schemas.datacontract.org/2004/07/DV_BII30'不是预期的。如果您正在使用DataContractSerializer或添加任何未知类型,请考虑使用DataContractResolver策略地添加到已知类型列表-例如,通过使用KnownTypeAttribute属性或将它们添加到传递给序列化程序的已知类型列表中。在System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContractdataContract,XmlWriterDelegatorxmlWriter,Objectobj,BooleanverifyKnownType,RuntimeTypeHandledeclaredTypeHandle,TypedeclaredType)在System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsijandleobjectHriterType,ObjectHriterWriterDelegator对象,XMLobjectType,Int32declaredTypeID,RuntimeTypeHandledeclaredTypeHandle,TypedeclaredType)在System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegatorxmlWriter,Objectobj,BooleanisDeclaredType,BooleanwriteXsiType,Int32declaredTypeID,RuntimeTypeHandledeclaredTypeHandle)在WriteArrayOfWorkerTemplateToXml(ObjectDelegatorXml,ObjectDelegatorXmlObjectSerializerWriteContext,CollectionDataContract)在System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegatorxmlWriter,Objectobj,XmlObjectSerializerWriteContextcontext)在System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContractdataContractType,XmlWriterDelegatorobjectxmlWriter)声明于System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValueRuntime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContractdataContract,XmlWriterDelegatorxmlWriter,Objectobj,RuntimeTypeHandledeclaredTypeHandle)在System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator编写器,对象图,DataContractResolverdataContractInterriteResolverData)在System.Runtime。(XmlWriterDelegator编写器、对象图、DataContractResolverdataContractResolver)在System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator编写器,对象图,DataContractResolverdataContractResolver)在System.Runtime.Serialization.XmlObjectSerializer.WriteObject(XmlDictionaryWriter编写器,对象图)在System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameterPart(XmlDictionaryWriter对象编写器,PartInfo部分)---内部异常堆栈跟踪结束---服务器堆栈跟踪:在System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameterPart(XmlDictionaryWriter编写器,PartInfo部分,对象图)在System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameter(XmlDictionaryWriter编写器,PartInfo部分,对象图)在System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeParameters(XmlDictionaryWriter编写器,PartInfo[]部分,Object[]参数)在System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.SerializeBody(XmlDictionaryWriter编写器,MessageVersion版本,字符串操作,MessageDescriptionmessageDescription,对象returnValue,Object[]参数,BooleanisRequest)在System.ServiceModel.Dispatcher.OperationFormatter.SerializeBodyContents(XmlDictionaryWriter编写器,MessageVersion版本,Object[]参数,ObjectreturnValue,布尔值isRequest)在System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage.OperationFormatterBodyWriter.OnWriteBodyContents(XmlDictionaryWriter作者)在System.ServiceModel.Channels.BodyWriterMessage.OnWriteBodyContents(XmlDictionaryWriter作者))在System.ServiceModel.Channels.BufferedMessageWriter.WriteMessage(Messagemessage,BufferManagerbufferManager,Int32initialOffset,Int32maxSizeQuota)在System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageSystem.ServiceModel.Channels.HttpOutput.SerializeBufferedMessage(消息消息,布尔值shouldRecycleBuffer)在System.ServiceModel.Channels.HttpOutput.Send(TimeSpan超时)处的Encoder.WriteMessage(消息消息,Int32maxMessageSize,BufferManagerbufferManager,Int32messageOffset)。ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.SendRequest(消息消息,TimeSpan超时)在System.ServiceModel.Channels.RequestChannel.Request(消息消息,TimeSpan超时)在System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息消息,TimeSpan超时)在System.ServiceModel.Channels.ServiceChannel.Call(字符串操作,布尔单向,ProxyOperationRuntime操作,Object[]ins,Object[]outs,TimeSpan超时)在System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessagemethodCall,ProxyOperationRuntime运行)在System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessagemessage)Exceptionrethrownat[0]:atSystem.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessagereqMsg,IMessageretMsg)atSystem.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&msgData,Int32type))在DV_BII30.ServiceReference1.IPQWService.EnqueueWorker(WorkerTemplate[]worker)在DV_BII30.Program.Main(String[]args)在C:TFSrobert.hartmannPCOFeaturesCDW5.0PrototypingSourcesDTSxDataVault_Staging_CDWDV_BII30Program9p告诉你做什么Ex:liner11消息是'Type“DV_BII30.ExecSQLWorker”,数据协定名称为“ExecSQLWorker:http://schemas.datacontract.org/2004/07/DV_BII30”,如果您正在使用DataContractSerializer或将任何静态未知类型添加到已知类型列表中,则不应使用,请考虑使用DataContractResolver-例如,通过使用KnownTypeAttribute属性或将它们添加到传递给序列化程序的已知类型列表中。有关详细信息,请参阅InnerException。—>System.Runtime.Serialization.SerializationException:意外输入数据协定名称“DV_BII30.ExecSQLWorker:http://schemas.datacontract.org/2004/07/DV_BII30”为“DV_BII30.ExecSQLWorker”。如果您正在使用DataContractSerializer或将任何静态未知类型添加到已知类型列表中,请考虑使用DataContractResolver-例如,通过使用KnownTypeAttribute属性或将它们添加到传递给序列化程序的已知类型列表中。您有多种可能性来解决此问题。将KnownTypeAttribute添加到WorkerTemplate类[DataContract][KnownType(typeof(ExecSQLWorker))][KnownType(typeof(CopyWorker))]publicclassWorkerTemplate{//Propertiesandstuff}如果您可以更改IPQWService界面,请查看此处您可以使用DataContractResolverpublicclassSharedTypeResolver:DataContractResolver{publicoverrideboolTryResolveType(TypedataContractType,TypedeclaredType,DataContractResolverknownTypeResolver,outXmlDictionaryStringtypeName,outXmlDictionaryStringtypeNamespace){if(!knownTypeResolver.TryResolveType(dataContractType,declaredType,null,outtypeName,outtypeNamespace)}){XmlDictionary字典=newXmlDictionary();typeName=dictionary.Add(dataContractType.FullName);typeNamespace=dictionary.Add(dataContractType.Assembly.FullName);}}publicoverrideTypeResolveName(stringtypeName,stringtypeNamespace,TypedeclaredType,DataContractResolverknownTypeResolver){返回knownTypeResolver.ResolveName(typeName,typeNamespace,declaredType,null)??Type.GetType(typeName+","+typeNamespace);解析器接受您在服务中使用的每种类型,但您必须将解析器添加到客户端端点和服务器端点。像这样:以上就是C#学习教程:使用基类作为WCF服务的参数的全部内容分享。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——Host=newServiceHost(typeof(MyService));ContractDescriptioncd=Host.Description.Endpoints[0].Contract;foreach(varoperationincd.Operations){operation.Behaviors.Find().DataContractResolver=newSharedTypeResolver();代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢