我有一个启用了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>
答案 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; }
}
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();
}
}
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>