首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF服务可以传输类型(客户端不知道该类型)信息吗?

WCF服务可以传输类型(客户端不知道该类型)信息吗?
EN

Stack Overflow用户
提问于 2010-12-03 10:57:26
回答 4查看 2K关注 0票数 0

我正在开发一个简单的插件框架。WCF客户端需要创建一个'ISubject‘的实例,然后发送回服务端。'ISubject‘可以由用户扩展。客户端在运行时唯一知道的是'ISubject‘的子类的ID。

首先,客户端需要获取“ISubject”的特定子类的类型信息。其次,客户端使用反射枚举所有成员,创建自定义属性编辑器,以便为每个成员赋予适当的值。最后,客户端创建子类实例并发送回服务。

问题是客户端如何通过WCF通信获取类型信息?

我不希望客户端加载(‘ISubject’的)子类所在的程序集。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-04 03:32:59

首先,您需要意识到,在您所描述的场景中,WCF不会以神奇的方式向您的客户端提供任何类型信息。如果你要这样做,你必须自己提供一种机制。

接下来,要了解WCF并不真正将对象从服务器传递到客户端,反之亦然。它传递的所有内容都是XML信息集。通常,传递的XML信息集包括存在于发送方的某个对象的序列化表示;在这种情况下,如果客户端知道该类型(即可以从其程序集加载该类型的元数据),它可以反序列化XML以在客户端实例化一个相同的对象。如果客户端没有类型元数据,它就不能:这是WCF的正常情况,除非数据协定类型位于服务器和客户端实现共享的程序集中(通常不是一个好主意)。

按照WCF的正常使用方式(例如,如果客户端是使用Visual Studio中的“服务引用”实现的),发生的情况是服务发布描述其操作的WSDL元数据以及操作参数和返回值的XML架构,并从中生成一组类型以在客户端实现中使用。这些类型与服务实现所使用的数据合约类型不同,但它们在某种意义上是“等效的”,即它们可以被序列化为通过网络传递的相同.NET数据。通常,此类型生成是在Visual Studio中的设计时完成的。

为了完成您试图做的事情,本质上就是在运行时生成类型,您需要一些机制,通过这种机制,客户端可以充分了解表示实现ISubject的各种类型的对象的XML的结构,以便它能够理解从服务接收到的XML,并生成服务期望返回的适当的XML (直接使用XML,或者以某种方式对其进行反序列化/序列化)。如果你真的真的想这样做,可能的方法是:

  • 某种带外机制,通过该机制,客户端预先配置了与它可能看到的ISubject的每个子类相对应的相关类型信息。blindmeis的答案中提供的链接是实现这一点的一种方法。XSD提供了一个单独的服务操作,通过该操作,客户端可以将子类的ID转换为该子类的类型元数据(可能是作为一种

架构,客户端可以从该架构生成合适的可序列化.NET类型来往返)。

  • 服务在原则上也可以在包含序列化对象的响应的头部中以某种格式传递类型元数据。客户端需要以适当的方式读取、解释类型信息并对其执行操作。

无论采用哪种方式,都需要大量的工作,而且不是使用WCF的标准方式。你将不得不决定这是否值得。

票数 3
EN

Stack Overflow用户

发布于 2010-12-03 12:55:24

我认为您可能遗漏了一些东西:)

web服务和WCF的一个主要概念是,我们可以通过网络传递对象,客户端可以使用与服务器相同的对象。此外,当客户端在Visual Studio中添加服务引用时,服务器将向客户端发送它所需的所有详细信息,以了解将通过网络传递的任何类型。

应该不需要反射。

要介绍的内容很多,但我建议您从介绍WCF DataContracts - http://www.codeproject.com/KB/WCF/WCFHostingAndConsuming.aspx的本教程开始。

票数 1
EN

Stack Overflow用户

发布于 2010-12-03 11:15:38

要反序列化对象,接收方需要具有在其中定义该类型的程序集。

也许您应该考虑某种类型的远程处理或代理设置,其中ISubject实例驻留在一端,另一端回调它。如果您需要通过网络编组大量数据,这可能会有问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4342055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档