Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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#_Wpf_Wcf - Fatal编程技术网

C# 不寻常的WCF客户端行为

C# 不寻常的WCF客户端行为,c#,wpf,wcf,C#,Wpf,Wcf,我有一个SOA应用程序,它使用托管在Windows服务中的双工WCF服务。客户端本身是一个WPF应用程序 我看到关闭和重新启动客户端应用程序时出现异常行为。如果我在关闭一个实例后启动一个新实例,那么看起来什么都没有发生。但是,检查任务管理器会显示新实例正在作为后台进程运行。如果我尝试启动客户机应用程序的另一个新实例,它将显示我编写的错误屏幕-说明服务的错误。调查表明,客户端无法创建服务回调通道的新实例,因为另一个应用程序已经注册了URL。这是System.ServiceModel.Address

我有一个SOA应用程序,它使用托管在Windows服务中的双工WCF服务。客户端本身是一个WPF应用程序

我看到关闭和重新启动客户端应用程序时出现异常行为。如果我在关闭一个实例后启动一个新实例,那么看起来什么都没有发生。但是,检查任务管理器会显示新实例正在作为后台进程运行。如果我尝试启动客户机应用程序的另一个新实例,它将显示我编写的错误屏幕-说明服务的错误。调查表明,客户端无法创建服务回调通道的新实例,因为另一个应用程序已经注册了URL。这是System.ServiceModel.AddressalReadyUseException

如果在task manager中结束后台客户端任务,则显示错误消息的客户端将能够连接到服务并正常运行。我还注意到,如果在启动新实例之前关闭后台任务,新实例也不会出现

我在这里担心的是,这是不可用的,对用户来说是一个真正的麻烦。出了什么问题?似乎有什么东西没有清理非托管资源,但我使用了ANTS,无法识别它。客户端创建为:

IServiceCallback callback = new Callback();
_context = new InstanceContext(callback);

_channelFactory = new DuplexChannelFactory<IMyService>(_context, binding, endpoint);

_proxy =
    _channelFactory.CreateChannel();
((ICommunicationObject)_proxy).Open(TimeSpan.FromSeconds(5));
最后,客户端关闭通道,如下所示:

foreach (var incomingChannel in _context.IncomingChannels.ToArray())
{
    incomingChannel.Close();
}
try
{
    var proxy = _proxy as IChannel;
    if (proxy != null)
    {
        proxy.Close();
    }
}
catch (Exception)
{
    _channelFactory.Abort();
}
为什么我会看到这种不寻常的行为?关闭频道时,我是否遗漏了什么,或者我在创建频道时做了什么错事?或者,我的代码中可能存在使通道或会话保持活动状态的问题

**更新:**我一直在尝试一些事情,发现如果我启动一个客户端实例,关闭它,然后让它保持一个小时,我就可以毫无问题地启动另一个实例。我还发现,如果在创建和关闭客户端应用程序的实例后重新启动Windows服务,那么在这种情况下,我也可以创建另一个实例


**更新2:*逐步执行,我可以看到incomingChannel.Close()未完成,并且未引发错误。我已经删除了该部分,并且还发现proxy.Close()未完成,并且不会引发异常。我尝试使用重载并添加了超时,但没有引发超时异常。该服务的Dispose()方法根本不会被命中。

请尝试关闭频道工厂

proxy.ChannelFactory.Close();
proxy.Close();

根据您的症状,我想知道问题是否出在服务代码上,而不是客户端。您是否调试过该服务以查看与客户端的会话是否/何时终止?启动第二个会话时是否在服务上引发错误?这很难检查,因为只要连接了调试器,问题就不存在了。就好像VisualStudio补偿了这些问题,并硬重启了频道。
没有完成,也没有引发异常
这怎么可能?代码不只是在执行过程中进行午睡。嗯,我想它最终会超时,但它不会抛出任何异常,并且增加超时没有什么区别。我可以在5秒后设置超时,但20分钟后仍然没有发生任何事情。我正在逐行检查代码,但从未进入下一行。@MrShoes-启动WCF跟踪。这可能为我们指明了正确的方向。如果您查看更新2,您将看到Close方法实际上并没有完成。
foreach (var incomingChannel in _context.IncomingChannels.ToArray())
{
    incomingChannel.Close();
}
try
{
    var proxy = _proxy as IChannel;
    if (proxy != null)
    {
        proxy.Close();
    }
}
catch (Exception)
{
    _channelFactory.Abort();
}
proxy.ChannelFactory.Close();
proxy.Close();