可以WCF服务传输类型(客户端不知道这种类型)的信息?(Can WCF service transm

2019-11-04 09:21发布

我工作的一个简单的插件框架。 WCF客户端需要创建“ISubject”的一个实例,然后返回给服务端。 在“ISubject”可以由用户来扩展。 唯一客户端知道在运行时是“ISubject”的一个子类的ID。

首先,客户需要得到“ISubject”的具体子类的类型信息。 其次,使用反射来枚举所有成员的客户端创建一个自定义属性编辑器,使每个成员都可以通过适当值asigned。 最后,客户端创建一个子类的实例,并发送回服务。

问题是如何让客户通过WCF通信类型的信息?

我不希望客户端加载该程序集在哪里(“ISubject”)的子类存在。

谢谢

Answer 1:

首先,你需要知道,有没有神奇的方式,WCF将提供你descibed方案的任何类型的信息到客户端。 如果你要做到这一点,你就必须自己提供了一种机制。

接下来,了解到WCF并没有真正通过从服务器对象到客户端,反之亦然。 所有它传递的XML信息。 通常,通过XML信息集包括在发送侧存在的一些对象的序列化表示; 在这种情况下,如果客户端知道该类型(即可以加载从其组件的类型的元数据),它可以反序列化XML实例在客户端中的相同目标。 如果客户端不具有类型的元数据,它不能:这是正常情况下与WCF除非数据合同类型是由服务器和客户端的实现(一般不是一个好主意)共享组件。

WCF正常使用(例如,如果客户端使用Visual Studio中的“服务引用”执行)的方式,什么情况是,该服务发布WSDL描述的元数据的操作参数的操作和XML模式和返回值,以及从这些一组类型是在客户端实现使用中产生。 这些都是不一样的.NET类型的服务实现所使用的数据类型的合同,但他们在这个意义上的“等价”,他们可序列化到通过网络传递相同的XML数据。 通常这种类型的生成在Visual Studio的设计时间完成。

为了做你正在尝试做的,基本上是在运行时进行这种类型的一代,你会需要一些机制,使客户可以得到XML代表的各类对象实施ISubject所以结构有足够的认识它可以理解从服务接收到的XML并生成适当的XML服务期待背面(或者直接与XML,或反序列化工作/以某种方式串行化的话)。 如果你真的想这样做,可能的方式可能是:

  • 一些出带外机制,其中所述客户端被预先配置有对应于ISubject的每个子类,它可能看到相关的类型信息。 在blindmeis的回答提供的链接是做到这一点的方法之一。

  • 提供由该客户端可以转化子类的ID为子类(也许为XSD模式从该客户端可以产生合适的序列化的.NET类型以往返的XML)类型的元数据单独的服务操作。

  • 它也将是在原理上是可行的服务,在一些格式包含序列化的对象的响应的报头中传递类型的元数据。 客户端将需要阅读,理解并以适当的方式作用于类型信息来源。

无论怎样,这将是一个很大的努力,而不是使用WCF的标准方式。 你将不得不决定它是否值得。



Answer 2:

我想你可能会失去了一些东西:)

与Web服务和WCF的一个主要概念是,我们可以通过我们的对象通过网络,客户端可以使用相同的对象作为服务器的工作。 此外,当客户端增加了在Visual Studio中的服务引用时,服务器会发送客户端的所有需要​​知道这将通过网络传递的任何类型的细节。

应该没有必要进行反思。

有很多覆盖,但我建议在开始使用此教程涵盖WCF DataContracts - http://www.codeproject.com/KB/WCF/WCFHostingAndConsuming.aspx



Answer 3:

反序列化对象在接收侧需要有该类型是在限定的组件。

也许你应该考虑的一些类型的远程或代理设置的地方ISubject实例住在一边,另一边叫回去吧。 如果您需要调集大量的跨网的数据,这可能是有问题的。



Answer 4:

WCF需要知道真正的对象(而不是一个接口!)这应该通过线路发送。 所以你必须满足服务器,并从WCF服务,他们知道该类型clientproxy侧。 如果你不知道对象类型在创建WCF服务,你必须找到一种方法,做一个动态的方式。 我使用该解决方案从这里得到knownTypes到我的WCF服务。

[ServiceContract(SessionMode = SessionMode.Required]
[ServiceKnownType("GetServiceKnownTypes", typeof(KnownTypeHelper))]//<--!!!
public interface IWCFService
{
    [OperationContract(IsOneWay = false)]
    object DoSomething(object obj);
}

如果你有什么“万能”像上面的代码,你必须确保在运行时无论你的目标将是,WCF服务必须知道这个对象。

你写你的客户创建一个子类,并把它送回服务。 如果你想这样做,WCF(clientproxy和服务器!)需要知道真正的类型的子类。



文章来源: Can WCF service transmit type (client doesn't know this type) information?
标签: wcf service