如何在错误视图中显示堆栈跟踪?

时间:2014-05-09 09:45:23

标签: asp.net-mvc error-handling stack-trace

我有一个启用了customErrors的网站,它引导我进入自制视图。但是如果出现服务器错误,我想在SorryPage视图上显示堆栈跟踪。为什么?因为用户可以复制粘贴错误并将其发送到我们公司的IT帮助台,这样我们就知道出了什么问题以及错误来自哪里。

我以前见过这个,但不能再弄明白怎么做了。非常感谢任何帮助!

控制器:

public ActionResult SorryPage()
    {
        return View("Error", new ErrorModel(ErrorMessages.SorryPage, "General", "Home", Labels.GoBackToPortal));
    }

查看:

@using ILVO.Web.Resources
@model ILVO.Web.Areas.General.Error._Error.ErrorModel
@{
ViewBag.Title = "Error pagina";
Layout = "~/Views/Layouts/_Layout.cshtml";
}

<h1>@Html.Label("Error", Labels.TitleErrorPage)</h1>
<br/>
<h2>@Model.ErrorMessage</h2>

<br/>
<div class="margin-bottom5px">
@Html.ActionLink(Model.Button, "Index", Model.ToController, new { Area = Model.ToArea }, new { @class = "button" })
</div>

型号:

public class ErrorModel
{
    public ErrorModel(string errorMessage, string toArea, string toController, string button)
    {
        ErrorMessage = errorMessage;
        ToArea = toArea;
        ToController = toController;
        Button = button;
    }

    public string ErrorMessage { get; set; }
    public string ToArea { get; set; }
    public string ToController { get; set; }
    public string Button { get; set; }
}

我的cfg文件:

<customErrors mode="RemoteOnly" xdt:Transform="Replace" defaultRedirect="~/General/Error/SorryPage">
  <error statusCode="500" redirect="~/General/Error/SorryPage"/>
  <error statusCode="404" redirect="~/General/Error/NotFound"/>
</customErrors>

3 个答案:

答案 0 :(得分:2)

  

“因为用户可以复制粘贴错误并将其发送到我们公司的IT帮助台,这样我们就知道出了什么问题以及错误来自哪里”。

黑客可以使用该信息。为什么不记录信息或自己发送电子邮件?

您还可以使用我的(免费)服务,为您处理所有事情:https://onetrueerror.com

答案 1 :(得分:1)

你可以为你的错误创建Db,并使用过滤器将它们添加到Db。

型号:

public class ExceptionDetail
{
    public int Id { get; set; }
    public string ExceptionMessage { get; set; }    
    public string ControllerName { get; set; }  
    public string ActionName { get; set; }  
    public string StackTrace { get; set; }  
    public DateTime Date { get; set; }  
}

与Db的连接:

public class LoggerContext : DbContext
{
    public LoggerContext() : base("DefaultConnection")
    {
    }
    public DbSet<ExceptionDetail> ExceptionDetails { get; set; }
}

控制器:

public class HomeController : Controller
{
    LoggerContext db = new LoggerContext();

    public ActionResult Index() // here we have our errors
    {
        return View(db.ExceptionDetails.ToList());
    }
    [ExceptionLogger]// our filter
    public ActionResult Test(int id)// just random action
    {
        if (id > 3)
        {
            int[] mas = new int[2];
            mas[6] = 4;
        }
        else if (id < 3)
        {
            throw new Exception("id cann`t be < 3");
        }
        else
        {
            throw new Exception("id must be a number");
        }
        return View();
    }
}

现在是ExceptionLogger的代码(创建文件夹“Filters”并添加类“ExceptionLoggerAttribute”)

public class ExceptionLoggerAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        ExceptionDetail exceptionDetail = new ExceptionDetail()
        {
            ExceptionMessage = filterContext.Exception.Message,
            StackTrace = filterContext.Exception.StackTrace,
            ControllerName = filterContext.RouteData.Values["controller"].ToString(),
            ActionName = filterContext.RouteData.Values["action"].ToString(),
            Date = DateTime.Now
        };

        using (LoggerContext db = new LoggerContext())
        {
            db.ExceptionDetails.Add(exceptionDetail);
            db.SaveChanges();
        }

        filterContext.ExceptionHandled = true;
    }
}

查看:

您可以通过右键单击“索引”创建视图,然后选择template = List, model = ExceptionDetail,所有代码都将自动生成。

答案 2 :(得分:0)

最简单的方法是禁用“自定义错误”。您将获得经典的“死亡黄屏”,其中包括异常消息和堆栈跟踪。它应该看起来很丑,这样您才不会向世人展示。

<system.web>部分下的web.config内部,添加以下内容:

<customErrors mode="Off" />

您还可以在web.Debug.config中进行设置,以便仅将其部署到您的测试环境中。您将需要设置发布或构建服务器,并且您的测试环境将获得Debug配置。注意插入转换的使用。

<system.web>
  <customErrors mode="Off" xdt:Transform="Insert" />
</system.web>