【发布时间】:2012-01-22 05:52:23
【问题描述】:
我正在开发一个 winform 应用程序,该应用程序将访问作为 Windows 服务自托管的 WCF 服务。我使用的是 ChannelFactory 而不是服务参考。我已经成功连接和调用了WCF服务。问题是当我让应用程序保持空闲 20 分钟,然后尝试拨打另一个电话时。我收到以下错误:
“套接字连接被中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或底层网络资源问题造成的。本地套接字超时为“00:00:59.9489970”。 "
我正在寻找管理连接的最佳实践。我目前创建了一个名为 PrepareWCFConnection(见下文)的函数,用于检查通道和 ChannelFactory 的状态。在对 WCF 服务进行任何调用之前,我会调用此方法。有没有更好的处理方法?
public bool PrepareWCFConnection()
{
if ((channelFactory == null) ||
(channelFactory.State == CommunicationState.Faulted) ||
(channelFactory.State != CommunicationState.Opened))
{
channelFactory = new ChannelFactory<IService1>(new NetTcpBinding(), endpointAddress);
}
if ((proxy == null) ||
(((IClientChannel)proxy).State == CommunicationState.Faulted) ||
(((IClientChannel)proxy).State != CommunicationState.Opened))
{
proxy = channelFactory.CreateChannel(endpointAddress);
((IClientChannel)proxy).Open();
}
return true;
}
【问题讨论】:
-
对上述代码的更多测试证明它不起作用。 ChannelFactory 和通道都是打开的,但是在让系统空闲后我仍然收到此错误:套接字连接已中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或者是潜在的网络资源问题引起的。本地套接字超时为 '00:00:59.9479970'。
-
这是来自 MSDN 的链接,显示创建通道工厂和通道,拨打电话并关闭通道,然后关闭通道工厂。但是,如果您使用 creditials 进行身份验证,在每个方法调用之后关闭通道并在每个方法之前重新创建通道会不会耗费资源和时间? msdn.microsoft.com/en-us/library/ms734681.aspx
-
经过更多测试,我首先使用 PrepareWCFConnection() 开始对 WCF 服务的调用 ... 然后调用我的服务方法,然后调用 ((IClientChannel)proxy).Close();这是关闭通道连接,然后为每个方法调用创建一个新通道。这是最佳做法吗?
-
每次通话后我都会关闭频道。如果您保持打开但不活动,您将在 10 分钟后收到 CommunicationFaultedException。如果你真的想让你的频道保持开放,看看 ReliableService。不要关闭 ChannelFactory,而是重用它,因为它会完成所有初始配置。
标签: wcf timeout channelfactory