WCF OperationContract中IsInitiating和IsOneWay的含义

Tho*_*mas 3 wcf

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

[OperationContract(IsInitiating=false, IsOneWay=false)]
bool Add_Contact(int sessionkey, string Newusrname);
Run Code Online (Sandbox Code Playgroud)

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

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

vik*_*iki 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);
}
Run Code Online (Sandbox Code Playgroud)

一旦调用了启动方法,就可以对该方法进行后续调用,而不会影响其启动属性.

如果首先调用除initging方法之外的任何方法,则返回以下错误:

The operation ‘operationname’ cannot be the first operation to be called because
IsInitiating is false.
Run Code Online (Sandbox Code Playgroud)

必须首先调用启动方法,然后才能调用其他操作.

IsOneWay

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

IsOneWay参数指定服务操作是否返回回复消息.此参数的默认值为false,表示该方法不返回回复消息.

以下示例说明了单向通信:

[ServiceContract]
public interface IBuyStock
{
[OperationContract(IsOneWay = true)]
void Login(user);
[OperationContract(IsOneWay = false)]
void BuyStock(string stocksymbol, int quantity);
}
Run Code Online (Sandbox Code Playgroud)

在单向通信中,客户端启动通信并继续执行代码,并且不等待来自服务的响应.在双向通信中,它在继续执行代码之前等待服务的响应.

使用单向通信的缺点是调用者无法知道服务是否成功处理了消息.

任何返回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);
}
Run Code Online (Sandbox Code Playgroud)

IsTerminating属性设置为时true,会在发送回复消息后关闭会话(如果需要发送回复消息).在客户端,一个IsTerminatingtrue告诉WCF仅在回复到达客户端后关闭通道.

  • 这个答案至少有 2 个错误:`这个参数的默认值是 false,这意味着该方法不返回回复消息。`和`任何返回 IsOneWay 属性设置为 false 的值的方法都将返回异常.` (2认同)