WCF:代理打开和关闭 - whaaa?

标签 wcf

我正在使用 WCF 维护一个 Windows 窗体应用程序,并在内部使用 Net.TCP。我们连接的生命周期是 GET/USE/CLOSE。

我们遇到了应用程序池崩溃而没有任何痕迹的问题。在查看 netstat 时,我可以看到我何时进入应用程序,因为我们有一个登录服务。然而,即使我们在 using 语句中创建代理,netstat 中的连接也不会消失,直到我物理关闭应用程序。

这是正确的吗?我应该在客户端上做一些不同的事情来强制关闭连接吗?

因此,如果连接保持打开状态,它是否会在 openTimeout 期间保持打开状态?设置然后被拆除?

最佳答案

微软说你总是必须在最后关闭连接(参见 MSDN 上的 example)。我在此 article about WCF disposal handling 中发现了以下模式:

WCFServiceClient c = new WCFServiceClient();

try
{
    c.HelloWorld();
}
catch
{
    // acknowledge the Faulted state and transition to Closed
    c.Abort();

    // handle or throw
    throw;
}
finally
{
    c.Close();
}

文章说你应该避免 using由于它没有正确关闭和处理 WCF 服务客户端对象,您应该使用 try ... catch ... finally 来完成它。块而不是如上所示 - 这样您就可以处理异常(它将中止然后重新抛出或处理异常),并且您还负责最终关闭连接。这在Microsoft's WCF troubleshooting hints.中也有明确说明

注: c.Close()finally在异常(故障状态)的情况下不会造成任何伤害,因为我们调用 c.Abort()在重新抛出异常之前 c.Close()在这种情况下实际上什么都不做。但是,如果没有异常发生,则c.Close()实际上正常执行并且连接按预期关闭。

如果您的 WCF服务行为方式很奇怪,有很多(其他)事情可能会导致这种情况 - here你可以找到一些调试提示。

关于WCF:代理打开和关闭 - whaaa?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2838026/

相关文章:

javascript - IE 缓存 WCF 结果 - 我可以以某种方式解决这个问题吗?

wcf - 数据契约(Contract)和数据成员

c# - 在接口(interface)上定义的 WebApi 属性路由

WCF 代理返回数组而不是列表,即使集合类型 == Generic.List

wcf - 如何强制 net.tcp mex 端点 (mexTcpBinding) 参与端口共享?

wcf - WCF 中的动态数据协定

c# - 如何创建只有我可以使用 WCF 访问的公共(public)端点和本地端点?

WCF over SSL 问题

c# - 从作为 LocalSystem 运行的 WCF 托管服务以特定用户身份启动进程

c# - 微软同步框架日期时间问题