2011-11-07 46 views
0

我会用一些方法创建一个WCF服务。其中一种方法(即Connect方法)应该是第一个为了使用服务而调用的方法:换句话说,在使用所有其他服务方法之前,必须将其称为Connect方法。出于这个原因,我将其定义为IsInitiating属性设置为true,并且我已将此属性设置为false定义了其他方法。拒绝与服务的连接

此外,提供服务的节点必须能够拒绝来自其他节点的连接请求(例如,如果其他节点已经在使用该服务):是否有办法阻止使用该服务?

非常感谢!

回答

1

好吧,当然。

首先明白,默认情况下,WCF服务是一个“实例每请求”结构; IIS在应用程序池中维护的HttpApplications将“新建”您的服务合同类的副本,进行与请求有关的调用,然后该对象将超出范围并被销毁。现在

[ServiceContract(SessionMode = SessionMode.Required)] 
public interface IMyServiceContract 
{ 
    ... 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class MyServiceImplementation: IMyServiceContract 
{ 
    ... 
} 

,当你的服务被称为,“会话”的客户端和服务器之间建立,以及单:您可以指出您的服务应该在“实例每次会话”模式下运行覆盖此您的课程副本将被创建并保留在该会话的整个生命周期内(除非应用程序池被刷新,这可能会自动发生或通过IIS内的手动操作)。这是第一步。现在

,你可以做两件事情之一:

  • 任何方法简单地检查,除了连接()是否连接()被调用的自成立以来,该实例。如果没有,扔掉。

  • 让Connect()方法返回客户端必须传递给所有其他方法调用的一些实例作用域标记或GUID。如果调用者提供的GUID与实例内存中保存的GUID不匹配,则抛出该方法。

了解会话可以在请求之间超时。如果发生这种情况,您当前的实例将离开作用域并被销毁,并且将创建一个新实例来处理后续请求。因此,即使系统可以根据他们的会话识别实例,我也会选择第二种选择; GUID确保自上次调用以来客户端和服务实例都没有更改。

+0

** 1)**关于第二个选项,为什么客户端或服务实例会更改? ** 2)**由于会话可以在请求之间超时,我可以更改此超时吗?另外,我可以手动结束会话吗?我可以通过声明一个Disconnect方法并将IsTerminating属性设置为true来手动结束会话吗? ** 3)**如果连接应该被拒绝,我如何关闭TCP会话? – enzom83

+1

1)如果服务超时,服务实例可能会改变。 Web服务的基本架构意味着客户可能不知道这是否发生,但在这种情况下,他们需要。 2)是的,你可以改变超时。您也可以手动结束会话。 3)如果Web服务抛出,TCP连接将被终止。 – KeithS