【问题标题】:Custom errors not working with IISExpress自定义错误不适用于 IISExpress
【发布时间】:2011-09-12 14:02:36
【问题描述】:

我有一个 asp.net mvc 应用程序,并试图在使用 IISExpress 时遇到自定义错误。

在赌场很好地工作:

<customErrors mode="On" defaultRedirect="/error">
  <error statusCode="404" redirect="/error/notfound"/>
</customErrors>

当我之前将 mvc 站点部署到 IIS (7.5) 时,我要做的就是设置自定义错误:

<httpErrors errorMode="Detailed"/>

我尝试在 httpErrors 部分中明确指定状态代码,但没有任何效果。这是一个例子:

<httpErrors errorMode="Detailed" defaultResponseMode="Redirect">
  <clear/>
  <error statusCode="404" path="/error/notfound"/>
</httpErrors>

有什么想法吗?

谢谢 本

【问题讨论】:

    标签: iis-7.5 iis-express custom-error-pages


    【解决方案1】:

    这部分是由于我对实际调用自定义错误的方式有误解,而且(恕我直言),asp.net mvc 中的错误处理有点混乱。

    第一个问题是,在我的一些操作方法中,我正在检查对象是否存在,例如博客文章,如果博客文章为空,则返回 HttpNotFoundResult。我假设这会显示我为 404 错误设置的自定义错误页面。

    但是,事实并非如此。返回 HttpNotFoundResult 只是将响应的状态代码设置为 404。然后由 IIS 处理其余部分,显示 IIS 404 错误页面,如果浏览器有自己的自定义错误页面,则由浏览器处理。

    这里的一个解决方案是返回一个 HttpException,它将使用您的自定义错误页面,因为请求由 asp.net 处理。

    我选择创建一个新的 ActionResult,它允许我指定一个视图以及一个 http 状态代码。我更喜欢这个而不是抛出异常。

    下一个问题是,默认情况下,新的 MVC 项目定义了贪婪路由。如果您向/foo/bar 发出请求,默认的 MvcHandler 将寻找一个名为Foo 的控制器。找不到时返回404。

    我已经删除了默认路由并且没有贪心路由。这意味着与我的任何路由不匹配的 url 将不会由 asp.net 处理,而只会退回到 IIS。

    这里的解决方案是在我的路由配置底部创建一个通配符路由,以匹配 所有 其他请求并将它们转发到自定义 PageNotFound 操作,将状态代码设置为 404 并显示我的自定义视图。

    一些值得指出的事情。

    1. 您需要设置httpErrors errorMode="Detailed" 以使您的自定义错误页面显示在 IIS/IISExpress 中。但是,其余的可以不用管。
    2. 在customErrors 部分设置defaultRedirect 路径对500 错误没有影响。这是因为全局 HandleErrorAttribute 处理所有 500 个错误,只是寻找一个名为“错误”的视图来显示。这意味着如果您的自定义错误页面实际上是一个控制器操作,它将不会被调用。即使您明确指定了 500 错误页面,上述情况也是如此。
    3. 但您仍应保留 defaultRedirect 路径,因为如果未明确指定其他状态代码,它将用于其他状态代码。

    【讨论】:

    • httpErrors errorMode="Detailed" 对我来说是缺失的部分,谢谢
    【解决方案2】:

    如果您使用的是 iisexpress,您可以在 applicationhost.config 中注释掉整个 httpErrors 部分 并将其替换为以下内容:

    <httpErrors errorMode="Custom">
        <error responseMode="Redirect" statusCode="404" path="../missing/index.php" />
    </httpErrors>
    

    path 是您的自定义站点特定页面的 url 路径

    【讨论】:

    • 你不应该这样做,你会丢失404响应码
    • 主题是“自定义错误不适用于 IISExpress”,因此重定向会转到特定于站点的缺失页面,而不是常规的 IIS 404 错误页面。
    • 最佳做法是在保留相关错误代码的同时拥有自定义错误页面
    • @SouhaiebBesbes 您能否更具体地说明“丢失 404 响应代码”的含义?您的意思是您不会将其返回给客户端浏览器或其他东西?如果您的意思是您不会将其返回给客户端浏览器,您能解释一下为什么要向客户端返回 404 吗?
    • 您可以在自定义 404 页面的代码中重新设置响应代码。
    猜你喜欢
    • 2011-08-01
    • 2012-05-02
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    相关资源
    最近更新 更多