WCF:有没有办法返回能够在服务器上执行的对象?

时间:2010-03-12 09:09:45

标签: c# wcf

来自Java背景,这就是我的想法:

服务器向客户端提供对象。该对象应该能够在服务器上执行。

服务器:

private string _S = "A";

public interface IFoo { void Bar(); }

private class Foo : IFoo {
    void Bar() { _S = "B";}
}

public IFoo GetFoo() { return new Foo(); }

客户端:

IFoo foo = serverChannel.GetFoo();
foo.Bar();

这可能吗?或者我的理解是错误的,这不是它在WCF中的工作方式?什么是更好的设计?

2 个答案:

答案 0 :(得分:3)

不,我认为这不会起作用。你看:WCF 某种远程,远程对象或远程过程调用机制。

WCF的核心是消息传递基础架构。您的客户端在客户端代理上调用方法;客户端上的WCF运行时捕获输入参数和方法名称以及更多的碎片,将它们序列化为消息(文本或二进制),并通过线路发送该消息(使用您喜欢的任何传输)。服务器反向执行相同的操作,反序列化消息,实例化服务类,在该类上执行方法,并将返回值打包回序列化消息。

但客户端之间确实没有连接或远程连接。两者之间的任何东西都必须是可序列化的 - 以XML文本为核心。你可以传递具体的类等等 - 但你不能传递接口,对象引用等。

答案 1 :(得分:0)

不 - 你不能发送物品。正如marc_s指出的那样,WCF是一个面向消息的通信框架。

但是,你确实有不同的实例选项。

默认情况下,Windows Communication Foundation基于每个调用实例化服务:服务实例,公共语言运行时(CLR)对象仅在客户端调用正在进行时才存在。每个客户端请求都会获得一个新的专用服这就像J2EE中的无状态会话Bean。

另一种选择是基于会话的激活,类似于J2EE中的有状态会话Bean。使用此方法,当客户端为配置为会话感知的服务创建新代理时,WCF会激活新服务实例并将其附加到会话。客户端通过该代理发送的每条消息都将转到服务器端的同一实例。

此激活行为可通过ServiceContract属性进行选择。

Juval Lowy has written a good article on instantiation options in WCF

在这些实例化选项中,您可能会找到适合您的内容。