0

我有一个 WCF 服务在远程机器上的 Windows 服务中运行。在 WCF 服务的合同中,我有一个需要很长时间才能运行的方法设置为

[OperationContract(IsOneWay = true)]
void Update(myClass[] stuff);

一切正常,方法被调用,我可以看到它需要做什么开始完成。

问题是当我在我的代码中关闭 WCF 服务的实例时,它超时并且我得到:

套接字连接被中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或者是潜在的网络资源问题造成的。本地套接字超时为“00:02:00”。

我认为单向合同允许我解雇并继续前进。有什么我想念的吗?如果没有,是否有解决方法?

4

2 回答 2

3

服务接口定义上的 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 的书中也提到了单向操作:

如果排队的消息数量超过了队列的容量,那么客户端将阻塞,即使在发出单向调用时也是如此。然而,一个调用被排队,客户端被解除阻塞并且可以继续执行,而服务在后台处理操作。

因此,虽然单向操作确实允许即发即弃操作,但您仍然可能遇到客户端可能阻塞的情况。

于 2009-09-02T20:33:18.873 回答
2

您的“更新”是服务上的一种方法。

当您打开 wcf 客户端时,与服务的连接将保持打开状态,直到您调用 Close(或 Abort)。

您可能没有调用 close,因此它会一直保持打开状态,直到超时。

于 2009-09-02T20:08:50.403 回答