【问题标题】:WCF - Cannot access disposed objectWCF - 无法访问已处置的对象
【发布时间】:2017-03-09 19:22:07
【问题描述】:

我有一个使用 WCF 服务的 WPF 应用程序。服务实例上下文模式设置为 PerSession。在服务中,有一个方法可以回调客户端,发送从外部队列接收到的消息。

当我启动新服务并运行应用程序时,一切正常,回调通道处于打开状态。当我关闭应用程序并再次运行它时,回调总是抛出“无法访问已处理的对象”错误并处于关闭状态。

为了连接到服务表单客户端我使用了 DuplexChannelFactory,在关闭应用程序通道和通道工厂后被处理。我可以在日志中看到调用了 Closing 和 Closed 事件。我认为也许服务正在举行最后一个会话,或者当我重新运行应用程序时,它连接到已关闭的同一通道。我检查了会话 ID,它们是不同的。 UUId 是一样的。

对我来说,客户端应用在重启后似乎正在使用相同的频道。服务端是否缓存了有关频道的内容?

我希望我给出了足够的解释。如果需要,我会提供更多信息。任何想法如何解决这个问题?

谢谢

【问题讨论】:

  • 您是否确认您收到的错误不是来自 WCF 服务本身?在第一次断开连接后,WCF 服务内部可能发生了一些事情,导致下一次连接出现异常。另外,您是在初始化 WCF 服务时遇到错误,还是在实际尝试调用函数时遇到错误?
  • 你有完整的堆栈跟踪吗?
  • 此行为是设计使然。当客户端关闭时回调通道将关闭。
  • 你能展示一段记住回调和发送消息的服务器代码吗?

标签: c# .net wpf wcf


【解决方案1】:

我遇到过类似的错误,问题是 Internet 信息服务 (IIS) 应用程序池的“请求限制”太有限,导致应用程序池在每次请求后回收。只需将“请求限制”值更改为 0(即无限制)或更高的数字,即可解决此问题。

更改“请求限制”:

  1. 打开 IIS 管理器。
  2. 展开主机并点击“应用程序池”。
  3. 右键单击运行 Web 服务的应用程序池,然后从上下文菜单中选择“高级设置”。
  4. 向下滚动到“回收”部分,您将在其中找到“请求限制”。
  5. 指定新的“请求限制”。
  6. 点击“确定”。

【讨论】:

  • 这很有帮助。在我的情况下,AppPool 的虚拟内存限制设置得非常低,导致它在每次请求后都会回收。对于看到此内容的其他人,请务必检查所有回收设置。
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多