16

我有一个 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>

有任何想法吗?

谢谢本

4

2 回答 2

14

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

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

然而,这种情况并非如此。返回 HttpNotFoundResult 只是将响应的状态代码设置为 404。然后由 IIS 处理其余部分,显示 IIS 404 错误页面或由您的浏览器(如果它有自己的自定义错误页面)。

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

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

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

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

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

有些事情值得指出。

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

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

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

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

于 2016-11-30T00:59:19.770 回答