添加默认路径时,HttpError iis 配置抛出异常

问题描述 投票:0回答:5

我的配置可以正常工作并正确重定向以下错误

<httpErrors errorMode="Custom" 
        existingResponse="Replace" 
        defaultResponseMode="ExecuteURL" >
  <remove statusCode="403" />
  <remove statusCode="404" />
  <remove statusCode="500" />
  <error statusCode="403" responseMode="ExecuteURL" path="/Error/AccessDenied" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Error/PageNotFound" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Error/ApplicationError" />
</httpErrors>

但是当我添加以下默认路径来尝试添加一个包罗万象时

<httpErrors errorMode="Custom" 
        existingResponse="Replace" 
        defaultResponseMode="ExecuteURL" 
        defaultPath="/Error/ApplicationError">

服务器抛出 web.config 错误

HTTP Error 500.19 - Internal Server Error
The requested page cannot be accessed because the related configuration data for the page is invalid.
Module     CustomErrorModule

现在这直接与msdn上的文档相矛盾

任何帮助将不胜感激!!

asp.net iis-7 web-config custom-error-pages
5个回答
7
投票

您无法覆盖 IISExpress 中的 httpErrors“defaultPath”属性,因为 applicationhost.config 锁定了该属性:

<httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath">

您可以在此处阅读更多相关信息:https://support.microsoft.com/en-us/kb/942055可能会出现此问题:

当 IIS 配置文件的指定部分被锁定时 更高的配置级别。要解决此问题,请解锁 指定的部分,或者不要在该级别使用它。了解更多 有关配置锁定的信息,请参阅如何在 IIS 中使用锁定 7.0 配置


6
投票

使用 defaultPath 属性防止error 节点中使用 path 属性。因此,下面的配置将起作用(但当然它会为此处定义的所有 HTTP 错误显示相同的错误页面):

<httpErrors errorMode="Custom" existingResponse="Replace"
  defaultResponseMode="ExecuteURL" defaultPath="/Error/ApplicationError">
  <remove statusCode="403" />
  <remove statusCode="404" />
  <remove statusCode="500" />
  <error statusCode="403" responseMode="ExecuteURL" />
  <error statusCode="404" responseMode="ExecuteURL" />
  <error statusCode="500" responseMode="ExecuteURL" />
</httpErrors>

相关文档:https://msdn.microsoft.com/en-us/library/ms690576(v=vs.90).aspx


2
投票

这是因为 IIS 默认情况下(我刚刚在 IIS 10 中发现了这一点)在服务器级别锁定

defaultPath

错误表示某些父

web.config
属性已被锁定,因此不允许您覆盖它。

改变这个的方法是

  1. 打开IIS
  2. 选择树中的顶级节点(最有可能是您的服务器/计算机名称)
  3. 单击最后一行中的
    'Configuration Editor'
    图标。
  4. 在顶部的部分下拉列表中输入
    'system.webServer/httpErrors'
    Configuration Editor -> httpErrors -> defaultPath 属性
  5. 右键单击
    defaultPath
  6. 转到
    'defaultPath' attribute >
    子菜单
  7. 点击
    Unlock attribute
  8. 点击右上角的
    Apply Changes

不过,我通常建议不要这样做,因为您必须在部署站点的每台服务器上执行此操作。 (而且我也不确定像 Azure Web 应用程序这样不给你这种级别的访问权限的东西如何处理它)


0
投票

不确定它是否有帮助,因为它是一个旧线程,但如果有人需要以编程方式执行此操作,您可以使用类似的东西

using (ServerManager serverManager = new ServerManager())
{
    Configuration hostConfig = serverManager.GetApplicationHostConfiguration();
    ConfigurationSection confSection = hostConfig.GetSection(sectionName);
    confSection.SetMetadata("lockAttributes", "");

    serverManager.CommitChanges();
}

并使用“system.webServer/httpErrors”作为部分名称。属性defaultPath在IIS10中仍然被锁定


-2
投票

尝试用〜来

defaultPath="~/Error/ApplicationError"

© www.soinside.com 2019 - 2024. All rights reserved.