实例化服务器上的WCF服务对象,而不是客户端?
问题描述:
我在C#中编写了两个需要能够通信的应用程序(仅在一个方向上)。这两个应用程序将始终在同一台机器上运行,因此将WCF与命名管道一起使用,并自行托管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,所以必须有一个简单的方法......对吧?
答
WCF的ServiceHost
有一个构造函数,该构造函数完全用于服务类的单例实例,而不是服务类型。如果在服务主机中使用此构造函数,则必须将InstanceContextMode设置为Singleton。
请注意,在您引用的客户端代码中,IMyService myService
不是您所称的“服务器对象”......它是客户端代理,WCF通过该代理将消息从客户端路由到实际服务。
我完全错过了ServiceHost的构造函数,谢谢。 (是的,我可能会更仔细地解释我指的是“指向”IMyService实例的含义。) – Justin