【问题标题】:Reducing time out period on WCF Channel Dispose calls?减少 WCF Channel Dispose 调用的超时时间?
【发布时间】:2014-02-14 05:59:48
【问题描述】:

在 WCF 通道上调用 Dispose() 有时会阻塞一分钟,直到引发 TimeoutException。如果服务器已经从其末端拆除了通道,这似乎通常是这样的。

由于我们正在尝试处置通道,并且考虑到这通常发生在通道已经从另一端拆除时,是否可以减少用于Dispose() 调用的超时时间?

【问题讨论】:

  • 为什么不把它放在一个工作线程上让它做它的事情呢?
  • 我会,而且可能无论如何都会这样做,但取决于正在执行的调用数量,可能会占用大量线程。

标签: c# wcf


【解决方案1】:

在 WCF 通道上调用 Dispose() 有时会阻塞一分钟 直到引发 TimeoutException。这似乎通常是 服务器已经从末端拆除了频道。

并非总是如此。根据您的绑定和频道管理,在服务完成处理操作之前,您不能关闭/处置频道。

有一篇珍贵的文章here 解释了为什么单向调用并不总是单向的,也就是为什么关闭通道会阻塞。这可以帮助您选择其他绑定配置。

因为我们正在尝试处置频道并且通常考虑到这一点 当通道已经从另一个通道拆除时发生 最后,是否可以减少用于 Dispose() 调用?

这可以通过客户端配置文件中的客户端超时设置来管理。有四种设置(打开、发送、接收和关闭)。这取决于您的绑定,但通常是这样的(这里一分钟):

<binding openTimeout="00:01:00" 
             closeTimeout="00:01:00" 
             sendTimeout="00:01:00" 
             receiveTimeout="00:01:00">
</binding> 

这里是交易:当请求处理在服务上花费 1 分 30 秒时,WCF 客户端在此持续时间之后抛出 TimeoutExceptions。

调用 Dispose 或 Close 几乎相同,都会尝试关闭通道。您必须非常注意 Dispose/Close 问题:关闭通道可能会引发异常,导致通道保持打开状态。阅读途中避免这种情况here

我也很好奇为什么在您的上下文中调用 Dispose 需要 60 秒。这表明您的 WCF 实现中的某些内容无效。

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 2013-02-09
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多