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...
}
필 Haack에 의해 개발 된 라우팅 디버거가
당신은 당신의 자신의 컨트롤러 공장을 사용하고뿐만 아니라 그것을 등록 할 수 있습니다에서 : - (그물에 많은 예를 원하는 로깅을 삽입)
가에서 적응 : 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 } }
잊지 말아
ControllerBuilder.Current.SetControllerFactory(
typeof(YourControllerFactory));
추 신 : AOP (aspect oriented programming)의 일부 방법을 사용하여 postsharp 또는 spring.net을 통해 주입 할 수 있습니다. 당신은뿐만 아니라 컨트롤러를 넘어 간다 그러나 당신은 그 (것)들에 "제어기"이름을 가진 종류에 믿는 적용하기 위하여 조정 파일에있는 정규식을 놓을 수있는 또한 외침을 도청하기 위하여 당신이 수있는 엔진. –