来自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中的工作方式?什么是更好的设计?
答案 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
在这些实例化选项中,您可能会找到适合您的内容。