技术开发 频道

Programming WCF Services:分步操作、实例停用与限流


分步操作


    WCF提供了一种被称之为分步操作(Demarcating Operation)的方法,以应对服务契约的操作需要指定执行顺序的情况。分步操作是使用OperationContract特性的IsInitiating和IsTerminating属性:

[AttributeUsage(AttributeTargets.Method)] 
public sealed class OperationContractAttribute : Attribute
{
public bool IsInitiating
{get;set;}
public bool IsTerminating
{get;set;}
//More members
}

    一个分步操作的应用如下:
[ServiceContract(SessionMode = SessionMode.Required)] 
interface IOrderManager
{
[OperationContract]
void SetCustomerId(int customerId);

[OperationContract(IsInitiating = false)]
void AddItem(int itemId);

[OperationContract(IsInitiating = false)]
decimal GetTotal( );

[OperationContract(IsInitiating = false,IsTerminating = true)]
bool ProcessOrders( );
}
    此时,操作AddItem()、GetTotal()以及ProcessOrder()都不能是启动会话的第一个操作。同时,ProcessOrder()操作则会成为终止会话的操作。这与业务的要求是一脉相承的。 

   IsInitiating属性的默认值为true,IsTerminating属性的默认值则为false。

    如果IsInitiating值为true,并不必然代表该操作必然是启动会话的第一个操作。如果其它相同设置的操作首先被调用,就会启动一个会话,而原操作则在调用时被加入会话,成为会话的一部分。但如果IsTermination的值为true,则代表该操作必须是终止会话的操作。虽然在服务契约定义时,允许将多个操作的IsTerminating值设置为true,但一旦调用了IsTerminating值为true的方法,就不能再调用服务实例的其它方法,除非在客户端重新创建一个代理对象。此外,即使操作的IsTermination值为true,它也可以是启动会话的第一个操作,但在操作执行后它会终止会话。因此,如下的两个操作定义是等效的:

[OperationContract(IsTerminating = true)] 
void StartAndEndSession();
[OperationContract(IsInitiating=true, IsTerminating = true)]
void StartAndEndSession();
    然而,如下的两个操作则是不等效的,因为后者要求该操作不能为启动会话的第一个操作:
[OperationContract(IsTerminating = true)] 
void StartAndEndSession();
[OperationContract(IsInitiating=false, IsTerminating = true)]
void StartAndEndSession();

0
相关文章