如何返回能够在服务器上执行的对象?

时间:2010-03-13 23:55:03

标签: c# remoting

来自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)而WCF基本上不支持这种情况(WCF: Is there a way to return an object that is able to execute on the server?),那么我该如何实现这种行为呢?如果需要,可以使用第三方组件。

我搜索了SO,但没有找到类似的问题。如果之前确实已经回答过,请告诉我,我会删除。

3 个答案:

答案 0 :(得分:4)

我建议不要尝试“远程”对象。这是一个危险的想法。

  1. 您无法对远程状态进行本地控制。你永远不会。
  2. 试图推断什么是“真实”状态,什么不是很快变得非常复杂。
  3. 从消息角度思考可能会导致设计从网络角度来看更加“正确” - 也就是说,设计正确地分配责任并且不做出不恰当的假设。
  4. 基于消息的网络应用程序几乎肯定会更强大。
  5. 基于远程处理的应用程序通常会允许更快的初始开发,但从长远来看会导致大量额外时间处理边缘条件等。
  6. 真的,不要这样做。远程对象有点不好。在核心层面,网络是关于传输数据。从长远来看,让您的程序使用相同的模型将使您的生活变得更加轻松。

答案 1 :(得分:3)

WCF确实是基于消息的,Remoting仍然有效....真正的问题是:你为什么不想基于消息工作?

答案 2 :(得分:2)

如果您希望在WCF中进行类型共享 - 就像您所描述的那样,并且在远程处理,在服务器和客户端上的公共程序集中共享(接口)声明 - 您可以使用NetDataContractSerializer来完成。它helped others as well

不鼓励使用它 - 就像远程处理一样 - 基于合同的消息传递现在似乎风靡一时。

我应该添加一个适当的设计,即使使用 .Net Remoting ,您仍然会得到基于合同/消息的应用程序。您的共享接口将成为操作合同,而您的共享数据类定义将描述您传递的数据合同/消息。