Tag: communicationexception

WCF,BasicHttpBinding:停止新连接但允许现有连接继续

.NET 3.5,VS2008,使用BasicHttpBinding的WCF服务 我有一个Windows服务托管的WCF服务。 当Windows服务因升级,定期维护等原因关闭时,我需要正常关闭我的WCF服务。 WCF服务的方法可能需要几秒钟才能完成,而典型的卷每秒需要2-5个方法调用。 我需要以允许任何先前调用方法完成的方式关闭WCF服务,同时拒绝任何新调用。 通过这种方式,我可以在约5-10秒内达到安静状态,然后完成Windows服务的关闭周期。 调用ServiceHost.Close似乎是正确的方法,但它会立即关闭客户端连接,而无需等待任何正在进行的方法完成。 我的WCF服务完成了它的方法,但是没有人发送响应,因为客户端已经断开连接。 这是此问题提出的解决方案。 以下是事件序列: 客户端使用VS生成的代理类调用服务方法 服务开始执行服务方法 服务收到关闭请求 服务调用ServiceHost.Close(或BeginClose) 客户端已断开连接,并收到System.ServiceModel.CommunicationException 服务完成服务方法。 最终服务检测到它没有更多的工作要做(通过应用程序逻辑)并终止。 我需要的是客户端连接保持打开,以便客户知道他们的服务方法成功完成。 现在他们只是获得了一个封闭的连接,并且不知道服务方法是否成功完成。 在使用WCF之前,我使用套接字并且能够通过直接控制Socket来实现。 (即在仍然执行接收和发送时停止接受循环) 关闭主机HTTP端口非常重要,以便上游防火墙可以将流量定向到另一个主机系统,但现有连接保持打开状态以允许现有方法调用完成。 有没有办法在WCF中实现这一目标? 我尝试过的事情: ServiceHost.Close() – 立即关闭客户端 ServiceHost.ChannelDispatchers – 在每个上调用Listener.Close() – 似乎什么都不做 ServiceHost.ChannelDispatchers – 在每个上调用CloseInput() – 立即关闭客户端 覆盖ServiceHost.OnClosing() – 让我延迟关闭,直到我决定关闭,但在此期间允许新的连接 使用此处描述的技术删除端点。 这抹去了一切。 运行网络嗅探器以观察ServiceHost.Close()。 主机只关闭连接,不发送任何响应。 谢谢 编辑 :不幸的是,我无法实现系统正在关闭的应用程序级别的咨询响应,因为该领域的客户端已经部署。 (我只控制服务,而不是客户端) 编辑 :我使用Redgate Reflector来查看Microsoft的ServiceHost.Close实现。 不幸的是,它调用了一些我的代码无法访问的internal帮助器类。 编辑 :我还没有找到我想要的完整解决方案,但是Benjamin建议在输入服务方法之前使用IMessageDispatchInspector拒绝请求。