WCF:超时错误

时间:2009-11-10 03:55:09

标签: c# .net wcf .net-3.5

我有一段代码调用托管在服务器上的WCF服务。

代码一直在循环调用此方法。 (它要求'状态',所以它根本不做任何工作。)

这很好,只是在很短的一段时间后我得到一个错误:
 发送到net.tcp:// serverName:9001 / service1的请求操作未在配置的超时(00:00:09.9843754)内收到回复

突然间我无法进入服务器。我将超时时间增加到1分钟但仍然是同样的问题。请注意,托管服务的程序不做任何其他事情,只是提供它的“状态”。因此,WCF服务应用程序忙碌不是问题。

我认为调用服务的代码存在问题,因为当我重新启动应用程序时,它可以很好地连接到服务......直到又过了很短的时间后我再次收到超时错误。出于这个原因,我也不认为这是一个网络错误,因为当我重新启动应用程序时,它可以在一段时间内完成。

这是我用来调用服务的代码。我是否需要在每次调用后处理ChannelFactory以清理它或者我在做什么?

        NetTcpBinding binding = new NetTcpBinding(SecurityMode.Message);
                binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

                EndpointAddress endPoint = new EndpointAddress(new Uri(clientPath));

                ChannelFactory<IClient> channel = new ChannelFactory<IClient>(binding, endPoint);
                channel.Faulted += new EventHandler(channel_Faulted);
                IClient client = channel.CreateChannel();

                ((IContextChannel)client).OperationTimeout = new TimeSpan(0, 0, 10);
                ClientStatus clientStatus = client.GetStatus();

1 个答案:

答案 0 :(得分:0)

完成调用GetStatus后,您必须关闭客户端连接。执行此操作的最佳方法是使用using块。但是在调用client.GetStatus()

之后,你也可以这样做
ClientStatus clientStatus = client.GetStatus();

try
{
    if (client.State != System.ServiceModel.CommunicationState.Faulted)
    {
         client.Close();
    }
}
catch (Exception ex)
{
    client.Abort();
}