检索/错误控制器中的HTTP错误详细信息

时间:2016-04-18 15:16:08

标签: asp.net-mvc error-handling

我正在使用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();
    }

2 个答案:

答案 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
                  : "");

}

通常我更喜欢将例外记录到数据库中,最重要的是你可以设置通知服务。