IIS中的自定义错误页面

时间:2016-10-07 09:52:40

标签: asp.net-mvc iis error-handling

我在web.config

中进行了以下设置
<customErrors mode="RemoteOnly" defaultRedirect="/ServerError" redirectMode="ResponseRewrite"/>

<httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="400" subStatusCode="-1" />
      <remove statusCode="404" subStatusCode="-1" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="400" path="/error/Error400" responseMode="ExecuteURL" />
      <error statusCode="404" path="/error/Error404" responseMode="ExecuteURL" />
      <error statusCode="500" path="/error/Error500" responseMode="ExecuteURL" />
</httpErrors>

通过上述配置,我们的网站能够捕获404,并显示从/ error / error404提供的404页面与404标题。

现在我有以下情况:
1.用户导航到/ action / id
2.找不到ID,我想返回404,但是提供自定义404,不同于/ error / error404提供的通用404。即提供不同的自定义页面;

在我的控制器中,我有以下内容:

Response.StatusCode=(int)HttpStatusCode.NotFound;                          
Response.TrySkipIisCustomErrors = true;
return View("SomeView", model);

这是可以实现的吗?

PS:使用IIS 8

LE 如果有人对我实施的解决方案感兴趣,我已完成以下工作:
1.在我的action中,我设置了一个会话变量Session["InvalidId"]=something
2.在我ErrorController我有以下内容:

var invalidId = Session["InvalidId"];
if(invalidId != null)
{
    return View("SomeView", model);
}

这有助于我为我的通用页面提供不同的404页面。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

是的,这很容易实现,而且你真的不需要其他页面。您需要为自定义消息提供一些会话变量,并使用它们来确定是否需要显示某些消息。如果是,请在您的视图中显示它们。

算法:

  1. 您的自定义页面检测到错误
  2. 生成一些错误消息
  3. 您的自定义页面会重定向到错误页面
  4. 错误页面会检查要显示的错误消息
  5. 如果存在此类错误消息,则会显示它们并清除错误消息队列

答案 1 :(得分:1)

根据您处理异常的方式,您可以创建自己的继承自HttpException的异常类。

[Serializable]
public class MyHttpException : HttpException
{
    // Constructors ...
    // You could either allow for an http status code to be passed in a 
    // constructor (to make your class more reusable) or you could call the
    // base constructor with 404 

    // Additional properties if needed ...
}

然后,在你的行动中,当你的条件得到满足时(即没有找到id),你可以抛出一个新的MyHttpException

您的异常处理机制可以测试当前异常是否为MyHttpException并对自定义视图做出反应。它也应该像你一样设置正确的响应状态代码。

状态代码可以来自MyHttpException,因为它是HttpException

(HttpStatusCode)myHttpException.GetHttpCode()

我不确定您拥有哪些控制器或如何捕获应用程序范围的异常,但我所拥有的是一个带有索引操作的ErrorController,其中Exception作为参数:

public ActionResult Index(Exception exception) { ... }

正是这个动作决定了基于异常对象返回的内容,类似于我上面描述的内容。

希望这有帮助。

P.S。我的web.config中有类似的<httpErrors>...</httpErrors>设置,我的自定义异常与404状态代码一起使用,如上所述。