服务接口定义上的 ServiceContract 属性将 SessionMode 属性默认为 SessionMode.Allowed,即
[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface IMyContract
{
[OperationContract(IsOneWay = true)]
void Update(myClass[] stuff);
}
根据 Juval Lowy 的Programming WCF Services,
...当使用 SessionMode.Allowed 配置 SessionMode 属性时,它仅允许传输会话,但不强制执行。确切的结果行为是服务配置和使用的绑定的产物。
因此,如果您将 WSHttpBinding 与安全或可靠的消息传递、NetTcpBinding 或 NetNamedPipeBinding 一起使用,则该服务将作为按会话服务运行。这仅仅意味着只要客户端代理没有关闭,服务和客户端之间仍然会存在会话。按照 Shiraz 的建议关闭客户端代理应该可以解决这个问题。
Juval 的书中也提到了单向操作:
如果排队的消息数量超过了队列的容量,那么客户端将阻塞,即使在发出单向调用时也是如此。然而,一个调用被排队,客户端被解除阻塞并且可以继续执行,而服务在后台处理操作。
因此,虽然单向操作确实允许即发即弃操作,但您仍然可能遇到客户端可能阻塞的情况。