0

我正在创建一个属性,以便每当我的站点上发生异常时,我都会收到一封详细说明异常的电子邮件。我到目前为止,但如果发生异常,我的属性代码似乎不会触发:

public class ReportingAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        // This will generate an email to me
        ErrorReporting.GenerateEmail(filterContext.Exception);
    }
}

然后在我的控制器上方我正在做:

[ReportingAttribute]
public class AccountController : Controller

另一种方法当然是放入ErrorReporting.GenerateEmail(ex)我的捕获块内?一定有更简单的方法吗?这就是为什么我想创建属性来处理这个

4

3 回答 3

2

为了记录所有未捕获的异常,您可以在Global.asax.cs文件中定义以下方法:

private void Application_Error(object sender, EventArgs e)
{
    try
    {
        //
        // Try to be as "defensive" as possible, to ensure gathering of max. amount of info.
        //

        HttpApplication app = (HttpApplication) sender;

        if(null != app.Context)
        {
            HttpContext context = app.Context;

            if(null != context.AllErrors)
            {
                foreach(Exception ex in context.AllErrors)
                {
                    // Log the **ex** or send it via mail.
                }
            }

            context.ClearError();
            context.Server.Transfer("~/YourErrorPage");
        }
    }
    catch
    {
        HttpContext.Current.Response.StatusCode = (int) HttpStatusCode.InternalServerError;
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
}
于 2012-04-13T11:17:52.653 回答
1

Attribute仅靠其本身不能定义行为,但它用于在您的代码数据上做一些标记。你应该写一个代码,你在哪里

  • 得到一个例外
  • 检查引发异常的方法中是否存在给定属性
  • 如果存在,请收集并发送您需要的数据。
于 2012-04-13T11:18:04.017 回答
0

为什么不创建一个基本控制器:

public ApplicationBaseController : Controller
{
    public override void OnException(ExceptionContext context)
    {
        //Send your e-mail
    }
}

并从ApplicationBaseController

public HomeController : ApplicationBaseController
{
    //.....
}
于 2012-04-13T11:25:15.553 回答