在某些地方,我看到IsInitiating创建了一个新会话。其他地方说它只在需要时创建一个新会话。哪个是对的?
为了说清楚,我想确保我可以在没有创建三个会话的情况下三次调用IService.Foo。
答案 0 :(得分:4)
第一次通过通道调用IsInitiating = true操作时,会话开始。对IsInitiating = true操作的未来调用不会启动新会话,它们只是成为现有会话的一部分。调用IsTerminating操作后会话结束(这会导致客户端关闭通道)。一旦IsTerminating操作返回,就不能通过通道调用进一步的操作。这些属性使开发人员可以控制相对于会话生存期的操作调用顺序。
答案 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会话需要记住三件事:
- 会话式绑定
- SessionMode服务合同
- InstanceContextMode服务行为
分界按执行顺序定义了第一个和最后一个操作。