使用IISExpress时自定义错误无法工作

16

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

有什么想法吗?

谢谢 Ben

2个回答

14

这部分问题部分是由于我对自定义错误的调用方式有所误解,另外也因为(在我看来),在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错误,并且只查找名为"Error"的视图来显示。这意味着,如果您的自定义错误页面实际上是控制器操作,它将不会被调用。即使您明确指定了一个500错误页面,上述情况仍然成立。
  3. 然而,您仍应该保留默认的重定向路径,因为它将用于其他状态码,如果它们没有被明确指定。

3
httpErrors errorMode="详细" 对我来说是缺失的一部分,谢谢。 - st78

1
如果您正在使用iisexpress,您可以注释掉applicationhost.config中的整个httpErrors部分 < !-- --> 并用以下内容替换:
<httpErrors errorMode="Custom">
    <error responseMode="Redirect" statusCode="404" path="../missing/index.php" />
</httpErrors>

路径是指您自定义网站特定页面的URL路径。

你不应该这样做,否则会丢失404响应代码。 - Souhaieb Besbes
1
主题是“自定义错误在IISExpress中无法工作”,以便重定向到特定于站点的缺失页面,而不是常规的IIS 404错误页面。 - developer68
最佳实践是在保留相关错误代码的同时拥有自定义错误页面。 - Souhaieb Besbes
@SouhaiebBesbes 你可以更明确地说明“丢失404响应代码”的含义吗?你是否指的是不返回给客户端浏览器,还是其他意思?如果你的意思是不会将其返回给客户端浏览器,那么你能解释一下为什么想要向客户端返回一个404吗? - qxotk
你可以在自定义的404页面的代码中重新设置响应代码。 - Protector one

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接