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

4
我对这个问题有些困惑,希望能在这里找到一些答案。基本上,我有一个运行在2个服务器上的ASP.NET应用程序。服务器A将所有业务逻辑/数据访问公开为Web服务,而服务器B具有与这些服务通信的网站(通过WCF,使用net.tcp绑定)。问题发生在IIS在服务器A上启动我的应用程序池的回收几秒钟后。回收在分配的时间之后发生(使用IIS中设置的默认值29小时)。在服务器A的服务器日志中:'####'进程ID的工作进程正在为'AppPoolName'应用程序池提供服务,因为工作进程达到了其允许的处理时间限制。我认为这是正常行为。问题是几秒钟后,我在服务器B上收到了这个异常:此频道无法再用于发送消息,因为输出会话由于服务器发起的关闭而自动关闭。通过将DispatchRuntime.AutomaticInputSessionShutdown设置为false来禁用自动关闭,或考虑修改与远程服务器的关闭协议。

这种情况并非每次回收都会发生;我认为它发生在某人在回收时向网站发送请求的时候。

此外,我的应用程序会停止工作,直到我进行干预;每次对页面发出后续请求时,都会继续发生此异常。我通过编辑web.config(在文件末尾添加空格或其他无关紧要的内容)来进行干预-我认为这会导致我的应用程序重新编译并使服务重新启动。我还尝试过运行一个批处理文件,在每次发生异常时自动执行此操作;)

现在,我几乎找不到有关此异常的任何信息,而且我已经寻找了一段时间。我找到的大多数信息都涉及我没有使用的WCF设置。

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

我阅读了this,其中介绍了一些通过某种方法自动恢复服务的解决办法,但我真正想要了解的是发生了什么情况,而不是绕过它。我已经开始尝试更改IIS7中的设置,特别是打开/关闭Overlapped Recycling并增加进程启动/关闭时间。我想知道完全关闭回收是否安全(我认为如果将回收时间间隔设置为0?)但再次说明,我想知道发生了什么!无论如何,如果您需要更多信息,请告诉我。先谢谢!

我也遇到了同样的问题。您找到解决方案了吗?被接受的答案似乎并不适用于我。 - Juan M. Elosegui
3个回答

4
这可能与您如何打开和关闭WCF连接有关。如果您在应用程序启动时打开代理并继续使用它,那么连接中断(由服务器端重新启动引起)会导致客户端出现错误,因为代理所连接的服务器已经不存在了。当您重新启动客户端(更改web.config),新的代理将针对正在运行的服务器创建。解决此问题的方法是确保在使用完WCF连接后关闭它。http://www.codeguru.com/csharp/.net/net_wcf/article.php/c15941/

我上次检查时认为一切看起来都没问题,但我会再次确认我是否关闭了连接。我会回复你的。 - donnovan9
不确定这是否是导致确切问题的原因,但关闭通道的方式存在问题 - 我使用了一个定制的代理类(继承自RealProxy)。我打算重写代码并观察结果,随着时间的推移,我将能够确定是否解决了问题。谢谢! - donnovan9

0

您还应确保为您的Web服务使用了正确的SessionMode。我记得在解决正确模式之前,我的某些服务也遇到了类似的麻烦。特别是当您将其与非“None”身份验证模式混合使用时,这一点尤为重要。

此链接可能会有所帮助。

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


这很奇怪,看起来我的某个服务将其InstanceContextMode设置为“Single”……其他所有服务都是“PerCall”。这可能是问题的原因。 - donnovan9
我们遇到了这个问题。单实例模式似乎定义了一个“单一”上下文。当您重新启动应用程序池时,它会重新启动该上下文,但您的客户端不知道这一点。因此,它发送了一个带有当前上下文的新调用,而不是请求一个新的上下文,从而导致错误。 - Wagner Silveira

0

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

如果您无法这样做,那么请关闭应用程序池的回收。应用程序池回收主要是因为Web开发人员编写了糟糕的代码。我知道这听起来很直白,但如果您有足够的常识编写不会泄漏的代码,那么没有理由让IIS不断重新启动您的程序。


第一种选择在我的情况下不可能,但第二种选择似乎越来越有吸引力 :) - donnovan9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,