我正在使用customErrors mode="RemoteOnly"
,并希望通过电子邮件通知向管理员报告错误详情。我不知道在引发HTTP错误时如何捕获详细的错误信息并调用View - 尤其需要HTTP 500s。
我想在控制器中插入当前错误详细信息,其中标记为< - ADD DETAILS HERE。免责声明:我了解错误电子邮件和后台Thread
的性能问题,并会优化'以后')。我使用的是MVC 5.2.3.0。
我的web.config
:
<customErrors mode="RemoteOnly" defaultRedirect="/error/error">
<error statusCode="400" redirect="/error/badrequest" />
<error statusCode="403" redirect="/error/forbidden" />
<error statusCode="404" redirect="/error/notfound" />
<error statusCode="414" redirect="/error/urltoolong" />
<error statusCode="500" redirect="/error/internalserver" />
<error statusCode="503" redirect="/error/serviceunavailable" />
</customErrors>
我的errorInfo
viewmodel:
namespace MyProject.ViewModels
{
public class ErrorInfo
{
public string Code { get; set; }
}
}
我的ErrorController
(仅显示HTTP 500):
public ActionResult InternalServer()
{
ErrorInfo errorInfo = new ErrorInfo();
errorInfo.Code = "500 - Internal Server Error"; <-- *ADD DETAILS HERE*
SendHttpErrorAsync(errorInfo.Code);
return PartialView("Error", errorInfo);
}
public void SendHttpErrorAsync(string message)
{
Thread httpError = new Thread(delegate ()
{
message = User.Identity.IsAuthenticated ? message + " | " + User.Identity.GetUserName() : message + " | anonymous";
message = message + " | " + Request.UserHostAddress; /*(::1 is localhost)*/
try
{
var requestUri = string.Format("http://ip-api.com/xml/{0}", Request.UserHostAddress);
var request = WebRequest.Create(requestUri);
var response = request.GetResponse();
var xdoc = XDocument.Load(response.GetResponseStream());
message = (xdoc.Element("query").Element("status").Value == "success") ? message + " | " + xdoc.Element("query").Element("city").Value : message + " | location unvailable";
}
catch
{
}
MyProject.Helper.Email.sendErrorEmail(message);
});
httpError.IsBackground = true;
httpError.Start();
}
答案 0 :(得分:1)
最好的选择是使用Elmah for Asp.net - 所有功能都已内置。
答案 1 :(得分:0)
在asp.net mvc中,您可以在Global.ascx文件上捕获Application_Error事件上的应用程序级错误。这是link。我们可以定义 只需将以下方法添加到全局ascx文件中即可。
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = HttpContext.Current.Server.GetLastError();
MyProject.Helper.Email.sendErrorEmail((ex.InnerException != null)
? ex.InnerException.Message
: "");
}
通常我更喜欢将例外记录到数据库中,最重要的是你可以设置通知服务。