首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义错误适用于HttpCode 403,但不适用于500?

自定义错误适用于HttpCode 403,但不适用于500?
EN

Stack Overflow用户
提问于 2012-04-20 23:01:32
回答 2查看 6.3K关注 0票数 5

我在我的MVC3应用中实现了自定义错误,它在web.config中处于打开状态:

代码语言:javascript
复制
<customErrors mode="On">
  <error statusCode="403" redirect="/Errors/Http403" />
  <error statusCode="500" redirect="/Errors/Http500" />
</customErrors>

我的控制器非常简单,有对应的正确命名的视图:

代码语言:javascript
复制
public class ErrorsController : Controller
{
    public ActionResult Http403()
    {
        return View("Http403");
    }

    public ActionResult Http500()
    {
        return View("Http500");
    }
}

为了测试,我在另一个控制器中抛出异常:

代码语言:javascript
复制
public class ThrowingController : Controller
{
    public ActionResult NotAuthorised()
    {
        throw new HttpException(403, "");
    }

    public ActionResult ServerError()
    {
        throw new HttpException(500, "");
    }
}

403工作-我被重定向到我的自定义"/Errors/Http403“。

500不起作用-我被重定向到共享文件夹中的默认错误页面。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-22 21:13:48

除了标准的customErros配置之外,我还使用httpErrors启动并运行了500个错误:

代码语言:javascript
复制
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="403" subStatusCode="-1" />
      <error statusCode="403" path="/Errors/Http403" responseMode="ExecuteURL" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" path="/Errors/Http500" responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>

并从global.asax中删除此行

代码语言:javascript
复制
GlobalFilters.Filters.Add(new HandleErrorAttribute());

然而,它并不完美,因为我正在尝试检索最后一个总是为空的错误。

代码语言:javascript
复制
Server.GetLastError()

有关MVC3中自定义错误的最全面的文章,请参阅https://stackoverflow.com/a/7499406/1048369,这对我很有帮助。

票数 4
EN

Stack Overflow用户

发布于 2012-04-20 23:09:05

我也遇到了同样的问题,在这种情况下,我直接在Global.asax中捕获了异常:

代码语言:javascript
复制
protected void Application_Error(object sender, EventArgs e)
        {
            Exception exception = Server.GetLastError();

            Response.Clear();



            HttpException httpException = exception as HttpException;

            var code = httpException == null ? 500 : httpException.GetHttpCode();

            // Log the exception.
            if (code == 500)
                logError.Error(exception);

            Server.ClearError();

            Context.Items["error"] = code;

            RouteData routeData = new RouteData();
            routeData.Values.Add("controller", "Error");
            routeData.Values.Add("action", "Index");
            routeData.Values.Add("code", code);

            IController errorController = new ErrorController();
            errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));

        }

这将重定向到我的自定义错误500: / Error /Index?code=500

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10248700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档