WCF:IsInitiating究竟做了什么?

时间:2009-03-24 22:38:14

标签: wcf

在某些地方,我看到IsInitiating创建了一个新会话。其他地方说它只在需要时创建一个新会话。哪个是对的?

为了说清楚,我想确保我可以在没有创建三个会话的情况下三次调用IService.Foo。

2 个答案:

答案 0 :(得分:4)

第一次通过通道调用IsInitiating = true操作时,会话开始。对IsInitiating = true操作的未来调用不会启动新会话,它们只是成为现有会话的一部分。调用IsTerminating操作后会话结束(这会导致客户端关闭通道)。一旦IsTerminating操作返回,就不能通过通道调用进一步的操作。这些属性使开发人员可以控制相对于会话生存期的操作调用顺序。

Sorry, Here is a link to the source.

答案 1 :(得分:0)

分界是通过一些特殊属性来注释服务操作,以确定服务执行顺序中的第一个和最后一个操作。考虑一个具有4个方法/操作的服务,分别名为SignIn(),GetDetails()。 TransferFund()和SignOut()。在这种情况下,用户必须登录,然后尝试获取详细信息并进行转移。如果用户退出,则在他登录之前不应允许他进行进一步的请求。要配置这种类型的执行顺序,需要进行分界。有两个属性:

IsInitiating (Default - True) 
IsTerminating (Default – False)

这些属性决定哪个操作应该首先调用,哪个操作应该最后调用?对于上述四个操作,可能是以下一种可能的顺序:

[OperationContract(IsInitiating = True)]
 Bool SignIn()

[OperationContract(IsInitiating = false)]
 String GetDetails()

[OperationContract(IsInitiating = false)]
 Bool TransferFund()

[OperationContract(IsInitiating = false, IsTerminating = True)]
 Bool SignOut()

此处的启动和终止是指为进行分界而必须执行的会话,因为服务需要知道客户端是否遵循特定的顺序。这里将操作2、3和4设置为IsInitiating = false,因此不能首先调用,而可以在调用Isinitiating = True操作之后调用。同样,操作4注释为IsTerminating = True,这就是为什么调用它时,它会终止会话(以及基础通道),然后客户端无法再调用,直到创建了新的代理和IsInitiating = True操作叫做。要使用分界,必须进行以下配置:

会话支持绑定 SessionMode设置为Required 调用IsTerminate操作时,WCF会丢弃该通道,并且从不接受任何进一步的消息。如果未使用这些属性中的任何一个显式修饰操作,则这些属性的默认值将适用于该操作。

仅此而已。

最后,只需重述一次-WCF会话需要记住三件事:

  
      
  1. 会话式绑定
  2.   
  3. SessionMode服务合同
  4.   
  5. InstanceContextMode服务行为
  6.   

分界按执行顺序定义了第一个和最后一个操作。