我有一个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>
有什么想法吗?
由于 本
答案 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并显示我的自定义视图。
有些事情值得指出。
httpErrors errorMode="Detailed"
设置为在IIS / IISExpress中显示自定义错误页面。然而,其余部分可以单独留下。defaultRedirect
部分设置customErrors
路径对500错误没有影响。这是因为全局HandleErrorAttribute
处理所有500个错误,只是查找要显示的名为“Error”的视图。这意味着如果您的自定义错误页面实际上是控制器操作,则不会调用它。即使您明确指定500错误页面,上述情况也是如此。答案 1 :(得分:0)
如果您使用的是iisexpress,则只需注释掉整个httpErrors部分&lt; ! - - &gt;在applicationhost.config中,并将其替换为以下内容:
<httpErrors errorMode="Custom">
<error responseMode="Redirect" statusCode="404" path="../missing/index.php" />
</httpErrors>
path是自定义网站特定网页的网址路径