2013年10月26日 星期六

ASP.NET MVC 4 WebApi 中使用 ActionFilter 紀錄 Log

在 ASP.NET MVC 4 中每個 Controller Action 執行期間,需要紀錄每個使用者的呼叫 Action 的狀態,一方面記錄使用過程,另一方面如果在此當中發生錯誤,紀錄此錯誤狀態訊息,好讓程式人員能夠依照錯誤訊息來改善系統功能。

首先必須要了解整個 Action 在觸發時,會執行哪一些 Filter:
圖片來源:http://www.cnblogs.com/me-sa/archive/2009/06/09/1499414.html

依上圖來看,事件的紀錄,不管是否產生錯誤,都可以在 OnActionExecuted 紀錄。

接下來說明一下在 ASP.NET MVC 4 WebApi 中 設置過程。

1.

新增一個類別檔在 Filters 底下,暫名為 WebApiActionFilterAttribute.cs,內容程式碼為:
namespace EnterprisePortal.Filters
{
    using System;
    using System.Net;
    using System.Net.Http;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    using System.Web.Http.Controllers;
    using System.Web.Http.Filters;
    using Microsoft.WindowsAzure;
    using Microsoft.WindowsAzure.StorageClient;
    using EnterprisePortal.Models;

    public class WebApiActionFilterAttribute : ActionFilterAttribute
    {
        private const string LogTableName = "Logs";

        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            
        }

        public override void OnActionExecuted(HttpActionExecutedContext context)
        {
           ... 紀錄 Log,狀態都在 context 可以找到
            
        }
    }
}

2.

最後直接在你的 BaseApiController 中類別上加上 [WebApiActionFilter],或者直接在 Global.asax 註冊,程式碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Web.Http;
using EnterprisePortal.Models;
using EnterprisePortal.Filters;


namespace EnterprisePortal.Controllers
{
    [WebApiActionFilter]
    public class BaseApiController : ApiController
    {
        protected DefaultConnection db = new DefaultConnection();
    }
}

3.

測試吧! 隨便在一個 Action 丟出引數為無效的錯誤:
public IEnumerable Get()
{
    throw new ArgumentException();
    return new string[] { "value1", "value2" };
}

4.

最後在 WebApiActionFilterAttribute.cs 中,OnActionExecuted 設上中斷點,測試是否錯誤訊息有擷取到:


沒有留言 :

張貼留言

Related Posts Plugin for WordPress, Blogger...