Windows 进程激活服务的致命通信错误

Posted

技术标签:

【中文标题】Windows 进程激活服务的致命通信错误【英文标题】:Fatal Communication Error with the Windows Process Activation Service 【发布时间】:2017-02-22 15:43:09 【问题描述】:

我有一个 .NET WebAPI 应用程序在我的开发机器的 IIS 上本地运行,但如果我将它部署在服务器上,就会出现错误

HTTP 错误 503。服务不可用。

每当我尝试访问 API 时。同时,AppPool 停止(是的,它已正确启动并正确运行,直到我进行 API 调用)并且我在事件查看器中收到错误:

为应用程序池“MyNewTestAppPool”提供服务的进程与 Windows 进程激活服务发生了致命的通信错误。

我调用的控制器是一个非常复杂的控制器:

public class ExampleController : ApiController

    [HttpGet]
    public bool GetTrue()
    
        return true;
    

所以这不会是由于我的代码中的无限循环导致的堆栈溢出问题。我担心这是身份验证和授权链中的死循环。

对在同一服务器上正确部署的另一个应用程序的主要更改是,该应用程序的大多数控制器都需要针对本地 AD 进行身份验证,而单个控制器则不需要 - 而其他应用程序要么总是需要身份验证,要么从不.

为了实现这种混合模式,我做了以下工作:

在Web.config中,我添加了<authentication mode="Windows" /> 在 IIS 中,我启用了匿名身份验证和 Windows 身份验证 在Global.asax.cs 中,我将AuthorizeAttribute 添加到所有控制器:GlobalConfiguration.Configuration.Filters.Add(new System.Web.Http.AuthorizeAttribute()); 无需身份验证即可访问的单个函数已设置[AllowAnonymous] 属性。

不确定那里发生了什么,有人知道发生了什么或如何调试吗?

【问题讨论】:

如果您删除身份验证并且只允许匿名访问,那么这个 api 在 IIS 上可以正常工作? 不,该 api 在我的开发人员计算机上的 IIS 上正常工作,应用程序的配置与服务器上的相同。如果我从 IIS 设置中删除 Windows 身份验证,则没有任何变化。如果我从我的代码中删除授权属性,则没有任何变化。如果我将两者都删除,我可以以匿名用户身份访问所有内容。 应用程序池被禁用真的很奇怪。您是否尝试过使用不同的应用程序池或其他东西?您还说同一服务器上还有其他应用程序启用了 Windows 身份验证并且它们不会使进程崩溃? 是的,我就是这么说的。由于该旧应用程序处于“生产中”,因此我在第一次崩溃后将新应用程序移动到不同的(新)应用程序池中,以免反复崩溃生产应用程序池。这并没有解决它。在重新启动我的计算机(它想安装 Windows 更新),然后在 Visual Studio 中清理并重建,然后部署再次应用... WTF!? 【参考方案1】:

确保 \IIS_IUSRS (IIS 7.x) 对应用文件夹具有读取权限。确保您使用的应用程序池标识位于 IIS_IUSRS 组中(例如 IIS APPPOOL\DefaultAppPool)

【讨论】:

以上是关于Windows 进程激活服务的致命通信错误的主要内容,如果未能解决你的问题,请参考以下文章

服务应用程序池的进程遇到致命的通信错误 5011

应用程序池错误

如何诊断 IIS 致命通信错误问题

Windows进程激活服务错误2:系统找不到指定的文件

Linux部署KMS激活Windows 10和Office 2016

Windows激活服务器搭建