WCF OperationContract中IsInitiating和IsOneWay的含义

时间:2013-01-03 10:23:45

标签: wcf

我是WCF的新手。经常注视wcf代码&文章。在查看了许多代码之后,我经常坚持使用非常基本的东西,并且没有对下面的问题进行详细的讨论。所以这里是我的几个基本问​​题....并寻找详细讨论样本情况和示例代码。

[OperationContract(IsInitiating=false, IsOneWay=false)]
bool Add_Contact(int sessionkey, string Newusrname);

IsInitiating = false或true的含义是什么?什么时候我应该设置它是真还是假? IsOneWay = false或true的含义是什么?什么时候我应该设置为真还是假?

我相信我的问题是非常基本的,每次监控这个论坛都有很多学者。我希望我会在很多情况下得到最好的答案,例如当一个人应该选择哪个选项而不是其他选项时,几乎没有用于模拟情境的示例代码。感谢

2 个答案:

答案 0 :(得分:7)

<强> IsInitiating

IsInitiating参数指定相关方法是否实现的操作 可以在服务器上启动会话。会话实例化是具有单独的类实例的能力 为每个客户渠道维护。此属性控制是否允许操作 创建会话时调用的第一个操作。此参数的默认值为true,表示该参数 指定的操作可以是第一个在通道上调用的。在这种情况下,以下所有调用此方法 没有效果(意思是,没有创建其他会话)。如果此参数设置为false,则强制客户端 在调用此方法之前调用其他方法。

当您尝试设置“操作顺序”时,这会派上用场,这意味着您需要特定的操作 首先调用的方法因为调用的其他方法依赖于从中返回的内容 第一种方法。

例如,以下包含三种方法或服务操作。第一个操作创建了 session,必须是第一个调用的方法。最后一个操作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

默认情况下,服务通信是双向的。双向服务通信意味着a 服务操作可以接收传入的消息并发送回复。

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时,会话将在发送回复消息后关闭(如果 需要发送回复消息)。在客户端,IsTerminatingtrue告诉WCF关闭 只有在回复到达客户端后才能进行通道。

答案 1 :(得分:-2)

[OperationContract(IsInitiating = true,IsTerminating = false)]

  

块引用

在上面的代码中,当我们想要创建会话时,IsInitiating属性设置为true。

  

块引用

我们知道在其他方法之前首先调用登录方法,因此我们 对登录方法使用IsInitiating = true,对于其他方法,我们将其设置为false。

  

块引用

我们以同样的方式使用Isterminating = True作为注销方法,然后删除会话。