WCF OperationContract中IsInitiating和IsOneWay的含义是什么?

3

我在WCF方面非常新手,在寻找WCF代码和文章时,经常会看到很多代码,但通常会卡在一些非常基本的问题上,并且没有详细的讨论以下问题。因此,这里是我几个基本问题...并希望能提供具体情况和示例代码的详细讨论。

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

IsInitiating=false或true的意义是什么?我应该何时将其设置为true或false?IsOneWay=false或true的意义是什么?我应该何时将其设置为true或false?

我相信我的问题非常基础,许多学者每次都在监控这个论坛。我希望能得到详细的最佳答案,并涵盖许多情况,例如何时选择哪个选项而不是其他选项,以及一些模拟情况的示例代码。谢谢


https://dev59.com/oUbRa4cB1Zd3GeqP5f2N - Freelancer
2个回答

7

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 仅在回复到达客户端后关闭通道。

我不理解您提供的语句。如果将此参数设置为false,则客户端在调用此方法之前必须调用其他方法。 - Thomas
你没有讨论IsTerminating选项的含义。如果可能的话,请对此进行一些解释。谢谢。 - Thomas
@Thomas,“如果将此参数设置为false,则客户端被强制在调用此方法之前调用其他方法”,意味着客户端不能在会话中首先调用IsInitiating设置为false的方法,否则将抛出异常。 - viki
2
这个答案至少有两个错误:该参数的默认值为false,意味着该方法不返回回复消息。任何将IsOneWay属性设置为false并返回值的方法都将返回异常。 - user145400
显示剩余4条评论

-2

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

引用块

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

引用块

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

引用块

同样地,我们对注销方法使用Isterminating=True,然后会话被删除。


3
“Blockquote”是什么意思? - Dan Hlavenka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接