2012-12-07 11 views
9

Po przejściu przez tego wspaniałego bloga post przez Simona dowiedziałem się, że wiązanie modelu dzieje się wcześniej niż wykonanie filtrów (nawet przed filtrami autoryzacji). Jeśli żądanie nie jest autoryzowane, powinno zostać odrzucone tak wcześnie, jak to możliwe, w takim przypadku wolę uruchamiać filtry autoryzacji przed procesem wiązania modelu. W ten sposób możemy zaoszczędzić czas, unikając skanowania żądania, tworzenia instancji modelu i przeprowadzania sprawdzania poprawności.Dlaczego wiązanie modelu dzieje się wcześniej niż filtry

Czy jest jakikolwiek powód, dla którego po prostu nie rozumiem, dlaczego rurociąg przetwarzający zlecenie MVC został zaprojektowany w taki sposób, aby wiązanie modelu miało miejsce przed filtrami?

Odpowiedz

7

W asp.net mvc3 filtry autoryzacji są wykonywane przed wiązaniem modelu, a nie po (patrz kod poniżej).

Wiązanie modelu występuje przed filtrami, ponieważ parametr ActionExecutingContext (parametr IActionFilter.OnActionExecuting) zawiera parametry akcji. Może powinni mieć leniwy załadowany te parametry.

Następujący kod pochodzi z System.Web.Mvc.ControllerActionInvoker.

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 
} 
Powiązane problemy