【F# + ASP.NET MVC】 アクション フィルターによるロギングを行うには

◆ アクション フィルター

namespace Sample.Attributes

open System
open System.Diagnostics
open System.Web.Mvc
open System.Web.Routing

type LogActionFilterAttribute() = 
    inherit ActionFilterAttribute()

    // ログ出力
    member private x.PutLog(methodName : string, routeData : RouteData) =
        let controllerName = routeData.Values.["controller"]
        let actionName = routeData.Values.["action"]
        let message = String.Format("{0} controller:{1} action:{2}"
            , methodName, controllerName, actionName)
        Trace.WriteLine(message, "アクション フィルター")

    override x.OnActionExecuting(filterContext) =
        x.PutLog("OnActionExecuting", filterContext.RouteData)

    override x.OnActionExecuted(filterContext) =
        x.PutLog("OnActionExecuted", filterContext.RouteData)

    override x.OnResultExecuting(filterContext) =
        x.PutLog("OnResultExecuting", filterContext.RouteData)

    override x.OnResultExecuted(filterContext) =
        x.PutLog("OnResultExecuted", filterContext.RouteData)

◆ Global.fs

namespace Sample.Routing

open System
open System.Web
open System.Web.Mvc
open System.Web.Routing
open System.Reflection

open Sample.Mef
open Sample.Controllers
open Sample.Attributes

type Route = { controller : string
               action : string
               id : UrlParameter }

type Global() =
    inherit System.Web.HttpApplication() 

    // フィルターを登録
    static member RegisterGlobalFilters(filters:GlobalFilterCollection) =
        // アクション フィルターをすべてのコントローラへ適用する
        filters.Add(new LogActionFilterAttribute())

    static member RegisterRoutes(routes:RouteCollection) =
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
        routes.MapRoute("Default", 
                        "{controller}/{action}/{id}", 
                        { controller = "Home"; action = "Index"
                          id = UrlParameter.Optional } )

    member this.Start() =
        AreaRegistration.RegisterAllAreas() 
        
        // フィルターを登録
        Global.RegisterGlobalFilters(GlobalFilters.Filters)
        Global.RegisterRoutes(RouteTable.Routes) |> ignore

◆ Controller

namespace Sample.Controllers

open System.Web
open System.Web.Mvc
open System.Diagnostics

open Sample.Attributes

type HomeController() =
    inherit Controller()
    
    member this.Index() =
        Trace.WriteLine("アクション実行")
        this.View() :> ActionResult

◆ 実行結果

アクション フィルター: OnActionExecuting controller:Home action:Index
アクション実行
アクション フィルター: OnActionExecuted controller:Home action:Index
アクション フィルター: OnResultExecuting controller:Home action:Index
アクション フィルター: OnResultExecuted controller:Home action:Index

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中