C# WCF服务实例将不会关闭,尽管只调用单向方法
我在远程计算机上的windows服务中运行WCF服务。 在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
[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他没有告诉我真正的问题是什么,但我认为他是在关闭服务的时候关闭了客户端代理。