IsInitiating
IsInitiating
参数指定与方法相关的操作是否可以在服务器上启动会话。会话实例化是具有单独实例的类为每个客户端通道维护的能力。该属性控制是否允许操作成为在创建会话时调用的第一个操作。默认情况下,此参数为true
,意味着指定的操作可以在通道上首先被调用。在这种情况下,对该方法的所有后续调用都没有影响(即不会创建其他会话)。如果将此参数设置为false
,则客户端必须在调用此方法之前调用其他方法。
当您尝试设置“操作顺序”时,这非常有用,这意味着您需要首先调用特定的方法,因为从第一个方法返回的某些内容取决于调用的其他方法。
例如,以下包含三个方法或服务操作。第一个操作创建会话并且必须首先调用。最后一个操作Logout关闭会话:
[ServiceContract]
public interface IBuyStock
{
[OperationContract(IsInitiating = true, IsTerminating = false)]
void Login(user);
[OperationContract(IsInitiating = false, IsTerminating = false)]
void BuyStock(string stocksymbol, int quantity);
[OperationContract(IsInitiating = false, IsTerminating = true)]
void Logout(user);
}
一旦调用了初始化方法,后续对该方法的调用将不会影响其初始化属性。
如果首先调用除初始化方法以外的任何方法,则会返回以下错误:
The operation ‘operationname’ cannot be the first operation to be called because
IsInitiating is false.
必须首先调用初始化方法,然后才能调用其他操作。
IsOneWay
默认情况下,服务通信是双向的。双向服务通信意味着服务操作可以接收传入的消息并发送回复。
IsOneWay参数指定服务操作是否返回回复消息。此参数的默认值为false
,表示该方法不返回回复消息。
以下示例说明单向通信:
[ServiceContract]
public interface IBuyStock
{
[OperationContract(IsOneWay = true)]
void Login(user);
[OperationContract(IsOneWay = false)]
void BuyStock(string stocksymbol, int quantity);
}
在单向通信中,客户端启动通信并继续代码执行,不等待服务的响应。而在双向通信中,它会在继续执行代码之前等待服务的响应。
使用单向通信的缺点是调用者无法知道服务是否成功处理了消息。
任何返回值的方法,在其
IsOneWay
属性设置为
false
时都会抛出异常。
IsTerminating
IsTerminating
属性指定所调用的服务操作是否终止通信会话。下面的示例显示了最后一个调用
Logout()
的
IsTerminating
属性已设置为
true
:
[ServiceContract]
public interface IBuyStock
{
[OperationContract(IsInitiating = true, IsTerminating = false)]
void Login(user);
[OperationContract(IsInitiating = false, IsTerminating = false)]
void BuyStock(string stocksymbol, int quantity);
[OperationContract(IsInitiating = false, IsTerminating = true)]
void Logout(user);
}
当
IsTerminating
属性被设置为
true
时,会在发送回复消息后关闭会话(如果需要发送回复消息)。 在客户端,
IsTerminating
值为
true
会告诉 WCF 仅在回复到达客户端后关闭通道。