【问题标题】:Meaning of IsInitiating and IsOneWay in WCF OperationContractWCF OperationContract 中 IsInitiating 和 IsOneWay 的含义
【发布时间】:2012-12-17 16:47:33
【问题描述】:

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

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

IsInitiating=false 或 true 是什么意思。我什么时候应该设置它为真或假? IsOneWay=false 或 true 是什么意思。我什么时候应该设置它为真或假?

我相信我的问题是非常基本的,每次关注这个论坛时都会有很多学者。我希望我能在很多情况下得到最好的答案,比如当一个人应该选择哪个选项而不是其他选项时,只需要很少的示例代码来模拟情况。谢谢

【问题讨论】:

标签: wcf


【解决方案1】:

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

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

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 关闭 只有在回复到达客户端后才进入频道。

【讨论】:

  • 看不懂你的这个说法....如果这个参数设置为false,客户端在调用这个方法之前会被强制调用其他方法??
  • 如果我设置 IsOneWay=true 那么方法会返回一些东西......我说的对吗?这是一个例子 [OperationContract(IsOneWay = true)] int BuyStock(string stocksymbol, int quantity); IsOneWay = true 是对还是错??
  • 你没有讨论 IsTerminating 选项的含义。如果可能的话,请给它一些亮点。谢谢
  • @Thomas,上面的这个答案是从 books.google.ie/… 的一本书中粘贴的。这些属性与服务方法是否将/可以启动或完成会话有关。它与使用服务 api 的长时间运行的转换有关。有时不可能使服务方法完全无状态。
  • 这个答案至少有2个错误:The default value for this parameter is false, meaning that the method does not return a reply message.Any methods that return a value where the IsOneWay property is set to false will return an exception.
【解决方案2】:

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

块引用

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

块引用

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

块引用

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

【讨论】:

  • Blockquotes 是什么?
猜你喜欢
  • 2012-12-04
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
相关资源
最近更新 更多