【问题标题】:How can I close WCF Service connections when I close my program关闭程序时如何关闭 WCF 服务连接
【发布时间】:2014-07-03 14:32:47
【问题描述】:

我在 Windows Azure 网站上托管我的 WCF 服务。在我的程序中,我选择了 1-16 个用户,对于每个选择的用户,我联系我的 wcf 服务并使用以下格式返回数据:

try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}

WCF 服务正在联系 Azure SQL 数据库以获取数据,这意味着服务调用总共可能持续长达 10 秒。但是,如果我在检索数据时关闭程序并再次打开它并尝试检索数据,则连接超时,我在我的 azure 网站上收到 HTTP 服务器错误,随后关闭 2-3 分钟。

如何在关闭程序时关闭 WCF 服务连接。我应该改用“使用”语句吗?而且我是否应该尝试重构我的代码以仅与服务联系一次,而不是为每个选定的用户联系一次?

【问题讨论】:

标签: c# web-services wcf azure


【解决方案1】:

它会自动关闭。但是如果你想确定,你可以使用finally block:

try
{
    ...
    client.Close();
}
finally
{
    if(client.State != CommunicationState.Closed)
        client.Abort();
}

【讨论】:

  • 如果在插件中建立连接并且插件关闭,连接是否也关闭?我猜这取决于插件的设置方式
  • @user1 在这种情况下它将被中止。但在大多数情况下,它已经足够了。
【解决方案2】:

你说你关闭程序时,你是通过在任务管理器中终止进程来关闭程序的吗?如果是这样,因为程序被无耻地关闭了,可能没有用于关闭连接的Tcp/IP会话。

如果您优雅地关闭程序以便调用 client.dispose(),服务器将确认连接关闭,而不是等待 tcp/ip 数据包到达并保持连接打开。

您可能正在按照 Uriil 的建议使用 try-finally 块。

    try
{

using (...)
{
...
}

}
catch (some exceptions...

【讨论】:

  • 所以我要关闭一个在程序中托管的插件。我发现我关闭了插件页面(该页面未显示)但代码仍在运行,这意味着我可能没有正确处理插件。意味着连接保持打开状态
  • 您没有透露您如何管理插件的生命周期,并且在您的评论中您已经怀疑您的插件没有正确处置,因此没有处置客户端代理。要找出答案,您只需在 Dispose 方法中添加调试跟踪消息即可。毕竟,一般情况下,客户端调用后立即处理客户端代理,而不是将处理与插件的处理联系起来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多