2012-12-07 28 views
9

Bu mükemmel blog'u Simon'a ilettikten sonra post Simon bu model bağlamanın filtreler yürütme işleminden daha önce gerçekleştiğini (yetki süzgeçlerinden önce bile) biliyordu. İstek yetkili değilse, mümkün olduğu kadar erken reddedilmeli ve bu durumda, model filtreleme işleminden önce yetki filtrelerini çalıştırmayı tercih ediyorum. Ayrıca, bu şekilde isteği taramaktan, model örnekleri oluşturmadan ve doğrulama işleminden kaçınarak zamandan tasarruf edebiliriz.Neden model bağlama filtrelerden daha erken gerçekleşir

MVC talep işleme boru hattının neden model bağlamalarının filtrelerden önce gerçekleşmesi için tasarlandığını anlamamın bir nedeni var mı?

cevap

7

asp.net mvc3'te, yetkilendirme filtreleri, sonradan değil, model bağlamadan önce yürütülür (aşağıdaki kod).

Model bağlama, filtrelerden önce gerçekleşir çünkü ActionExecutingContext (IActionFilter.OnActionExecuting parametresi) eylemin parametrelerini içerir. Belki de bu parametreleri tembelce yüklemiş olmalılar.

Aşağıdaki kod System.Web.Mvc.ControllerActionInvoker öğesinden alınmıştır.

public virtual bool InvokeAction(ControllerContext controllerContext, string actionName) 
{ 
    // code removed for brevity 
    try 
    { 
     // Notice the authorization filters are invoked before model binding 
     AuthorizationContext authContext = InvokeAuthorizationFilters(controllerContext, filterInfo.AuthorizationFilters, actionDescriptor); 
     if (authContext.Result != null) { 
      // the auth filter signaled that we should let it short-circuit the request 
      InvokeActionResult(controllerContext, authContext.Result); 
     } 
     else { 
      if (controllerContext.Controller.ValidateRequest) { 
       ValidateRequest(controllerContext); 
      } 
      // GetParameterValues does the model binding 
      IDictionary<string, object> parameters = GetParameterValues(controllerContext, actionDescriptor); 
      ActionExecutedContext postActionContext = InvokeActionMethodWithFilters(controllerContext, filterInfo.ActionFilters, actionDescriptor, parameters); 
      InvokeActionResultWithFilters(controllerContext, filterInfo.ResultFilters, postActionContext.Result); 
     } 
    } 
    // code removed for brevity 
}