我会用一些方法创建一个WCF服务。其中一个方法(即Connect
方法)应该是第一个被调用以便使用服务的方法:换句话说,在使用所有其他服务方法之前,必须调用{{ 1}}方法。出于这个原因,我将Connect
属性设置为IsInitiating
来定义它,并且我已将此属性设置为true
来定义其他方法。
此外,提供服务的节点必须能够拒绝来自另一个节点的连接请求(例如,如果其他节点已在使用该服务):有没有办法阻止使用该服务?
非常感谢!
答案 0 :(得分:1)
嗯,当然。
首先要了解默认情况下,WCF服务是“每个请求实例”构造; IIS在应用程序池中维护的HttpApplications将“新建”服务契约类的副本,进行与请求相关的调用,然后该对象将超出范围并被销毁。您可以通过声明您的服务应该以“每会话实例”模式运行来覆盖它:
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IMyServiceContract
{
...
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyServiceImplementation: IMyServiceContract
{
...
}
现在,当您的服务被调用时,在客户端和服务器之间建立“会话”,并且将创建您的类的单个副本并在该会话的生命周期内保留在内存中(除非刷新应用程序池,这可以自动发生,也可以通过IIS内的手动操作发生。这是第一步。
现在,你可以做以下两件事之一:
只需检查Connect()之外的任何方法,无论自创建以来是否已在此实例上调用Connect()。如果没有,请扔掉。
让Connect()方法返回一些实例范围的标记或GUID,客户端必须将其传递给所有其他方法调用。如果调用者提供的GUID与实例内存中保存的GUID不匹配,则抛弃该方法。
了解会话可以在请求之间超时。如果发生这种情况,您的当前实例将离开范围并被销毁,并将创建一个新实例来处理后续请求。因此,即使系统可以根据会话识别实例,我也会选择第二个选项; GUID确保自上次调用以来客户端AND服务实例都没有更改。