在服务器上实例化WCF服务对象,而不是客户端?

时间:2012-08-28 08:56:08

标签: c# wcf

我在C#中编写了两个需要能够进行通信的应用程序(仅在一个方向上)。这两个应用程序将始终在同一台机器上运行,因此使用带有命名管道的WCF并自行托管WCF服务,似乎是合乎逻辑的选择。

我知道我可以使用 InstanceContextMode 来配置每个会话,每次调用是否实例化服务实例,或者是否应该只有一个实例。在我的情况下,我想要一个实例,因为我将只运行两个应用程序,因此将有一个客户端和一个服务器。

但这就是我被困住的地方。当我的客户端对服务进行调用时,我正在这样做:

var myServiceFactory = new ChannelFactory<IMyService>(
    new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/MyService"));

IMyService myService = myServiceFactory.CreateChannel();
myService.DoStuff();

我不希望在服务器上创建新的服务器对象实例。相反,我希望 myService 指向服务器上已经构建的(唯一的)IMyService实例。目前,构建了第二个IMyService实例。

换句话说,我希望我的服务器对象由服务器构建(当服务器启动时),而不是客户端第一次调用时。

任何人都可以解释如何做到这一点?根据我的理解,.NET Remoting使这很容易,WCF据说取代了Remoting,所以必须有一个简单的方法......对吗?

1 个答案:

答案 0 :(得分:3)

WCF的ServiceHost有一个构造函数,它接受服务类的单例实例而不是服务类型,正是出于此目的。如果在服务主机中使用此构造函数,则必须将InstanceContextMode设置为Singleton。

请注意,在您引用的客户端代码中,IMyService myService不是您所谓的“服务器对象”...它是客户端代理,WCF通过该代理将消息从客户端路由到实际服务