是否有一個快速的方法來攔截MVC-3中的所有控制器調用?如何攔截MVC應用程序中的所有控制器調用?
對於日誌記錄和測試目的,我想建立一個工具,可以攔截所有控制器調用,並在什麼時間記錄哪個控制器被調用,以及哪個消息。
是否有一個快速的方法來攔截MVC-3中的所有控制器調用?如何攔截MVC應用程序中的所有控制器調用?
對於日誌記錄和測試目的,我想建立一個工具,可以攔截所有控制器調用,並在什麼時間記錄哪個控制器被調用,以及哪個消息。
我不記得在那裏我得到這個從,但我四周尋找類似的東西了一段時間後,發現了一個
public class LogActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Log("OnActionExecuting", filterContext.RouteData);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Log("OnActionExecuted", filterContext.RouteData);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Log("OnResultExecuting", filterContext.RouteData);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Log("OnResultExecuted", filterContext.RouteData);
}
private void Log(string methodName, RouteData routeData)
{
var controllerName = routeData.Values["controller"];
var actionName = routeData.Values["action"];
var message = string.Format("{0} controller: {1} action: {2}", methodName, controllerName, actionName);
Debug.WriteLine(message, "Action Filter Log");
}
}
要使用它,只需將其添加到全局過濾器在Global.asax中:包含此日誌記錄的過濾器製品或一些地方
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new LogActionFilter());
}
我現在來看看是否可以找到源代碼。
編輯:找到它。這是從this question。
根據網站已經有多大,您可以在框架的Controller
類和您的主控制器之間的層次結構中創建一個類。
喜歡的東西
public class MyBaseController : Controller {
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
// your logging stuff here
base.OnActionExecuting(filtercontext);
}
}
然後你的控制器的其餘部分可以由這一點,例如繼承
public class HomeController : MyBaseController {
// action methods...
}
有由菲爾哈克開發的路由調試
您可以使用自己的控制器工廠並將其註冊爲好: 來源:(在網絡上大量的實例 - 插入您想要記錄)改編自
:http://www.keyvan.ms/custom-controller-factory-in-asp-net-mvc
using System; using System.Configuration; using System.Web.Mvc; using System.Web.Routing; namespace IControllerFactorySample.ControllerFactories { public class YourControllerFactory : IControllerFactory { #region IControllerFactory Members public IController CreateController(RequestContext requestContext, string controllerName) { if (string.IsNullOrEmpty(controllerName)) throw new ArgumentNullException("controllerName"); IController controller = Activator.CreateInstance(Type.GetType(controllerName)) as IController; return controller; } public void ReleaseController(IController controller) { if (controller is IDisposable) (controller as IDisposable).Dispose(); else controller = null; } #endregion } }
不要忘記在global.asax.cs中註冊它
ControllerBuilder.Current.SetControllerFactory(
typeof(YourControllerFactory));
PS你也可以使用面向方面編程(AOP)的一些方法並通過postsharp或spring.net注入你也可以使用一個引擎來攔截調用(它不僅僅是控制器,而且你可以在配置文件中設置一個正則表達式,我相信這些正則表達式可以應用到名字爲'Controller'的類上。 – 2012-05-22 14:17:15