自定义错误不适用于IISExpress

时间:2011-06-10 15:00:52

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

我有一个asp.net mvc应用程序,我正在尝试使用IISExpress进行自定义错误。

在Casini工作正常:

<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>

有什么想法吗?

由于 本

2 个答案:

答案 0 :(得分:13)

这部分是由于我误解了实际调用自定义错误的原因以及(恕我直言)对asp.net mvc中的错误处理有点混乱的事实。

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

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

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

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

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

我删除了默认路由,没有贪婪路线。这意味着不匹配我的任何路由的网址都不会被asp.net处理,而只会回到IIS。

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

有些事情值得指出。

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

答案 1 :(得分:0)

如果您使用的是iisexpress,则只需注释掉整个httpErrors部分&lt; ! - - &gt;在applicationhost.config中,并将其替换为以下内容:

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

path是自定义网站特定网页的网址路径