WCF服务是否应该一直保持开启状态?

3

我正在创建一个WCF服务,我的WCF服务现在托管在控制台应用程序中,如下所示:

 PersonService = new ServiceHost(typeof(PersonService));
 PersonService.AddServiceEndpoint(typeof(IPersonService), binding, "http://localhost:5645/PersonService");
 PersonService.Open();

然后我使用ChannelFactory类来消费WCF服务;

EndpointAddress endPoint = new EndpointAddress("http://localhost:5645/PersonService");
ChannelFactory<IPersonService> engineFactory = new ChannelFactory<IPersonService>(binding, endPoint);
IPersonService personChannel = engineFactory.CreateChannel();

然后我可以使用这个通道来调用一个方法,比如:
personChannel.GetPersonById("1");
personChannel.Close();

我的问题是:

如上方的代码所示,服务在处理完后被关闭,而通道则一直保持开放状态。保持服务开启的行为是否好的行为,或者我是否应该在每次调用时打开服务并在结束后关闭它,因为可能会有两个客户端同时调用同一个服务。

请给予建议。

3个回答

5

你的服务必须保持“开放”——这是你们的行话,但实际上,“开放”调用会在端口上放置一个监听器。服务器必须继续监听,以便知道何时有客户端要连接它。如果没有这个,客户端将无法与不“听取”的服务器通信。

当客户端完成并得到所需内容后,它可以终止(关闭)连接并离开,从而节省双方的资源。

这就像打电话。有人必须坐在电话旁“倾听”,等待它响起。客户端拿起电话并拨打服务热线。服务热线电话响了。那个人(正在“倾听”)接起电话,开始了一次“连接”(即对话)。

当客户端完成后,他/她挂断电话,连接就结束了。然而,值班的服务热线人员必须继续“倾听”新的铃声。


我有一个Web应用程序,所有的通信都是使用WCF完成的,因此我有大约50个WCF服务。所以将所有服务保持打开状态是否可行? - Ghyath Serhal
抱歉,将TCP监听器与电话线进行比较是完全不恰当的。服务器“电话”几乎永远不会忙碌。它更像是一个交换机,将呼叫重定向到另一个接听客户呼叫的电话。 - jgauffin
@jgauffin,这个类比不太差...只是不完全正确。你的电话总机类比更正确,但是加入了一些复杂性,使得看清整个情况有些困难... - Stephen Chung
@Ghyath Serhal,我认为这没问题。只要那50个监听器不是非常活跃的话,在50个端点上保持50个监听器实际上并不会消耗太多资源。 - Stephen Chung
你的例子表明同一时间只能处理一个客户(因为只有一个服务热线电话)。但事实并非如此。 - jgauffin
@jgauffin,好的,好的。我的比喻更像是一种单一服务,当有一个连接处于活动状态时,它会拒绝其他连接。 - Stephen Chung

1
通常情况下,它应该保持开放状态,否则会破坏旧代理。

1

WCF服务消耗的资源很少,同时运行50个WCF服务也不是问题。但请确保它们共享TCP端口(在您的情况下是5645号端口)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接