首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF OperationContract中IsInitiating和IsOneWay的含义

WCF OperationContract中IsInitiating和IsOneWay的含义
EN

Stack Overflow用户
提问于 2013-01-03 18:23:45
回答 2查看 4.2K关注 0票数 3

我是WCF的新手。所以经常关注wcf代码和文章。在看了很多代码后,我经常坚持非常基本的东西,而没有对下面的问题进行详细的讨论。所以这里是我的几个基本question....and,查找详细信息,讨论示例情况和示例代码。

代码语言:javascript
复制
[OperationContract(IsInitiating=false, IsOneWay=false)]
bool Add_Contact(int sessionkey, string Newusrname);

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-03 19:35:13

IsInitiating

IsInitiating参数指定由关联方法实现的操作是否可以在服务器上启动会话。会话实例化是为每个客户端通道维护类的单独实例的能力。此属性控制是否允许某个操作成为创建会话时调用的第一个操作。此参数的默认值为true,这意味着指定的操作可以是通道上的第一个调用。在此场景中,对此方法的所有后续调用都不起作用(这意味着不会创建其他会话)。如果此参数设置为false,则强制客户端在调用此方法之前调用其他方法。

当您试图设置“操作顺序”时,这很方便,这意味着您需要首先调用一个特定的方法,因为调用的其他方法依赖于从第一个方法返回的内容。

例如,下面包含三个方法或服务操作。第一个操作创建会话,并且必须是调用的第一个方法。最后一个操作Logout关闭会话:

代码语言:javascript
复制
[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);
}

一旦调用了初始化方法,就可以在不影响其初始化属性的情况下对该方法进行后续调用。

如果首先调用初始化方法以外的任何方法,则会返回以下错误:

代码语言:javascript
复制
The operation ‘operationname’ cannot be the first operation to be called because
IsInitiating is false.

必须先调用初始化方法,然后才能调用其他操作。

IsOneWay

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

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

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

代码语言:javascript
复制
[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

代码语言:javascript
复制
[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时,会话在发送回复消息后关闭(如果需要发送回复消息)。在客户端,WCF值true告诉IsTerminating仅在回复到达客户端后才关闭通道。

票数 7
EN

Stack Overflow用户

发布于 2014-08-07 10:21:50

OperationContract(IsInitiating =真,IsTerminating =假)

区块引用

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

区块引用

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

区块引用

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14136950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档