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 に答える