IIS7进程回收后,两台服务器之间的WCF通信崩溃

时间:2010-01-23 17:03:49

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

我对这个很难受,并希望我能在这里找到答案。

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

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

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

  

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

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

  

此频道无法再使用   发送消息作为输出会话   由于a自动关闭   服务器启动的关闭。或   通过设置禁用自动关闭   DispatchRuntime.AutomaticInputSessionShutdown   假,或考虑修改   使用遥控器关闭协议   服务器

每次回收都不会发生这种情况;我认为当有人在回收发生时请求访问网站时会发生这种情况。

此外,我的申请一直停止,直到我介入;每次对页面发出后续请求时,都会继续发生此异常。我通过编辑web.config进行干预(通过在文件末尾添加一个空格或良性的东西)并保存它 - 我认为这会导致我的应用程序重新编译并重新启动服务。我还尝试过运行批处理文件,每次发生异常时都会为我执行此操作;)

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

我已经读过“DispatchRuntime.AutomaticInputSessionShutdown”,我不认为这与这种情况有关。此特定属性是指服务自动关闭以响应客户端的行为,这不是此处发生的情况。此处,由于IIS,服务将关闭。

我读了this,它经历了一些工作,自动恢复服务,但我真的很想了解这里发生了什么,而不是破解它!

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:0)

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

此链接可能有一些指针。

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

答案 2 :(得分:0)

我的建议是简单地停止使用IIS来托管您的服务。除非您确实需要从IIS中获得某些内容,否则我建议您只编写标准Windows服务来托管您的WCF端点。

如果你不能这样做,那么一定要关闭回收。 AppPool回收主要是因为Web开发人员编写糟糕的代码。我知道这听起来很直率,但如果你有足够的意识来编写不泄漏的代码,那么就没有理由让IIS不断重启你的程序。