3

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

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

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

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

4

2 回答 2

7

正在启动

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属性指定调用的服务操作是否要终止通信会话。以下示例显示了最后一次调用 , 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 仅在回复到达客户端后关闭通道。

于 2013-01-03T11:35:13.290 回答
-2

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

块引用

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

块引用

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

块引用

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

于 2014-08-07T02:21:50.390 回答