Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF服务实例将不会关闭,尽管只调用单向方法_C#_.net_Wcf_Wcf Client - Fatal编程技术网

C# WCF服务实例将不会关闭,尽管只调用单向方法

C# WCF服务实例将不会关闭,尽管只调用单向方法,c#,.net,wcf,wcf-client,C#,.net,Wcf,Wcf Client,我在远程计算机上的windows服务中运行WCF服务。 在WCF服务的合同中,我有一个方法需要很长时间才能运行设置 [OperationContract(IsOneWay = true)] void Update(myClass[] stuff); 一切正常,方法被调用,我可以看到它需要做什么,开始做 问题是,当我在代码中关闭WCF服务实例时,它超时,我得到: 套接字连接已中止。 这可能是由错误引起的 处理您的消息或接收 远程服务器正在超过超时 主机或底层网络 资源问题。本地套接字超时 是“0

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

[OperationContract(IsOneWay = true)]
void Update(myClass[] stuff);
一切正常,方法被调用,我可以看到它需要做什么,开始做

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

套接字连接已中止。 这可能是由错误引起的 处理您的消息或接收 远程服务器正在超过超时 主机或底层网络 资源问题。本地套接字超时 是“00:02:00”

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

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

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

您可能没有调用close,因此它在超时之前保持打开状态。

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

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


您可能没有调用close,因此它在超时之前保持打开状态。

服务接口定义上的ServiceContract属性将SessionMode属性默认为SessionMode.Allowed,即

[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface IMyContract
{
    [OperationContract(IsOneWay = true)]
    void Update(myClass[] stuff);
}
根据Juval Lowy的说法

…当SessionMode属性为 已配置SessionMode.Allowed, 它只允许传输会话, 但并没有强制执行。确切的 由此产生的行为是 服务配置和绑定 用过

因此,如果将WSHttpBinding与安全或可靠消息传递、NetTcpBinding或NetNamedPipeBinding一起使用,则该服务将作为每会话服务。这仅仅意味着,只要客户机代理尚未关闭,服务和客户机之间的会话就仍然存在。按照设拉子的建议关闭客户代理,应该可以解决这个问题

Juval的书中也提到了单向操作:

如果队列中的消息数为 超出了队列的容量,然后 客户端将阻塞,即使在 发出单向呼叫。然而,一个 呼叫已排队,客户端已停止 未被阻止并可以继续执行, 当服务处理 在后台操作


因此,虽然单向操作允许启动并忘记操作,但您仍可能遇到客户端可能会阻塞的情况。

服务接口定义上的ServiceContract属性将SessionMode属性默认为SessionMode.Allowed,即

[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface IMyContract
{
    [OperationContract(IsOneWay = true)]
    void Update(myClass[] stuff);
}
根据Juval Lowy的说法

…当SessionMode属性为 已配置SessionMode.Allowed, 它只允许传输会话, 但并没有强制执行。确切的 由此产生的行为是 服务配置和绑定 用过

因此,如果将WSHttpBinding与安全或可靠消息传递、NetTcpBinding或NetNamedPipeBinding一起使用,则该服务将作为每会话服务。这仅仅意味着,只要客户机代理尚未关闭,服务和客户机之间的会话就仍然存在。按照设拉子的建议关闭客户代理,应该可以解决这个问题

Juval的书中也提到了单向操作:

如果队列中的消息数为 超出了队列的容量,然后 客户端将阻塞,即使在 发出单向呼叫。然而,一个 呼叫已排队,客户端已停止 未被阻止并可以继续执行, 当服务处理 在后台操作


因此,虽然单向操作确实允许启动并忘记操作,但您仍可能遇到客户端可能会阻塞的情况。

。。。。除非您将单向调用设置为异步调用,否则,您将立即返回,而不会阻塞。。。。除非您将单向调用设为异步调用—在这种情况下,您将立即返回,而不会阻塞everI。我不明白这是一个公认的答案。在Matt的问题中,他说,“问题是当我在代码中关闭WCF服务实例时,它超时了”。因此,他正在关闭WCF服务,而这仍然导致超时exception@GarryEnglish他没有回答问题的真正原因,但我认为他是在关闭服务的时候关闭了客户代理。我不明白这是怎么一个公认的答案。在Matt的问题中,他说,“问题是当我在代码中关闭WCF服务实例时,它超时了”。因此,他正在关闭WCF服务,而这仍然导致超时exception@GarryEnglish他没有告诉我真正的问题是什么,但我认为他是在关闭服务的时候关闭了客户端代理。