【问题标题】:WCF communication between 2 servers crashes after IIS7 process recycleIIS7 进程回收后两台服务器之间的 WCF 通信崩溃
【发布时间】:2010-01-23 17:03:48
【问题描述】:

我有点被这个问题难住了,希望我能在这里找到一些答案。

基本上,我有一个跨 2 台服务器运行的 ASP.NET 应用程序。服务器 A 将所有业务逻辑/数据访问公开为 Web 服务,服务器 B 拥有与这些服务通信的网站(通过 WCF,使用 net.tcp 绑定)。

在服务器 A 上的 IIS 启动我的应用程序池回收几秒钟后出现问题。回收发生在分配的时间之后(使用 IIS 中设置的默认 29 小时)。

在(服务器A的)服务器日志中:

进程 ID 为的工作进程 '####' 服务应用程序池 “AppPoolName”已请求回收 因为工作进程到达了它的 允许的处理时间限制。

我认为这是正常行为。问题是几秒钟后,我在服务器 B 上得到了这个异常:

此频道不能再用于 发送消息作为输出会话 由于以下原因自动关闭 服务器启动的关闭。任何一个 通过设置禁用自动关闭 DispatchRuntime.AutomaticInputSessionShutdown 为假,或考虑修改 与遥控器的关机协议 服务器。

并非每次回收都会发生这种情况;我假设它发生在有人通过请求访问网站而回收发生时。

此外,在我进行干预之前,我的申请已被关闭;每次对该页面发出后续请求时,此异常都会继续发生。我通过编辑 web.config 进行干预(通过在文件末尾添加空格或其他良性内容)并保存它 - 我假设这会导致我的应用程序重新编译并恢复服务。我还尝试过运行一个批处理文件,每次异常发生时都会为我执行此操作;)

现在,我几乎找不到有关此异常的任何信息,而且我一直在寻找一段时间。我找到的大部分信息都与我没有使用的 WCF 设置有关。

我已经阅读了“DispatchRuntime.AutomaticInputSessionShutdown”,但我认为它与这种情况无关。此特定属性是指服务自动关闭以响应客户端的行为,这不是这里发生的情况。此处,服务因 IIS 而关闭。

我确实阅读了this,它通过某种工作来自动恢复服务,但我真的很想了解这里发生了什么,而不是绕过它!

我已经开始使用 IIS7 中的设置,特别是打开/关闭重叠回收并增加进程启动/关闭时间。我想知道完全关闭回收是否安全(我相信如果我将回收时间间隔设置为 0?)但是,我想知道发生了什么!

无论如何,如果您需要更多信息,请告诉我。提前致谢!

【问题讨论】:

  • 我也面临同样的问题。你找到解决办法了吗?接受的答案似乎不是我的解决方案。

标签: c# .net asp.net wcf iis-7


【解决方案1】:

这可能与您打开和关闭 WCF 连接的方式有关。

如果您在应用启动时打开代理,然后继续使用它,则连接中断,这是由服务器端重新启动引起的。导致客户端出错,因为代理正在与之通信的服务器不再存在。

当您重新启动客户端(更改 web.config)时,会针对正在运行的服务器创建新代理。

解决此问题的方法是确保在使用 WCF 连接后关闭它。

http://www.codeguru.com/csharp/.net/net_wcf/article.php/c15941/

【讨论】:

  • 上次检查时我认为一切正常,但我将再次检查我是否正在关闭我的连接。我会回复你的。
  • 不确定这是否是导致确切问题的原因,但我关闭通道的方式存在问题 - 使用自定义代理类(继承自 RealProxy)。我将重写代码并看看会发生什么,及时我将能够判断这是否修复了它。谢谢大佬!
【解决方案2】:

您还应该确保为您的 Web 服务使用正确的 SessionMode。我记得在我整理出正确的模式之前,我的一些服务也遇到了类似的问题。当您将其与任何其他非“无”身份验证模式混合使用时尤其如此。

这个链接可能有一些指针。

http://msdn.microsoft.com/en-us/library/ms731193.aspx

【讨论】:

  • 这很奇怪,看起来我的一项服务的 InstanceContextMode 设置为“Single”......其余的都是“PerCall”。这可能是问题所在。
  • 正是我们遇到的问题。单实例模式似乎定义了一个“单一”上下文。当您重新启动应用程序池时,它会重新启动该上下文,但您的客户端不知道它。因此,它使用当前上下文发送一个新调用,而不是请求一个新调用,因此会出现错误。
【解决方案3】:

我的建议是停止使用 IIS 来托管您的服务。除非您确实需要 IIS 提供的东西,否则我建议您只编写一个标准的 Windows 服务来托管您的 WCF 端点。

如果您不能这样做,那么请务必关闭回收。 AppPool 回收主要是因为 Web 开发人员编写了糟糕的代码。我知道这听起来很生硬,但是如果您有足够的意识编写不泄漏的代码,那么没有理由让 IIS 不断地重新启动您的程序。

【讨论】:

  • 第一个选项在我的情况下是不可能的,但第二个似乎越来越有吸引力:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 2011-02-20
  • 2013-01-08
  • 2015-08-25
  • 1970-01-01
  • 2013-04-10
相关资源
最近更新 更多