9
Simon發佈了這個優秀的博客post後,我發現模型綁定比過濾器執行(甚至在授權過濾器之前)發生得早。如果請求未被授權,則應儘早拒絕該請求,在這種情況下,我更願意在模型綁定過程之前運行授權過濾器。另外,通過這種方式,我們可以節省時間,避免掃描請求,創建模型實例並執行驗證。爲什麼模型綁定比過濾器更早發生
是否有任何理由,我簡直不明白爲什麼MVC請求處理管道的設計,使模型綁定應該發生在過濾器之前?
Simon發佈了這個優秀的博客post後,我發現模型綁定比過濾器執行(甚至在授權過濾器之前)發生得早。如果請求未被授權,則應儘早拒絕該請求,在這種情況下,我更願意在模型綁定過程之前運行授權過濾器。另外,通過這種方式,我們可以節省時間,避免掃描請求,創建模型實例並執行驗證。爲什麼模型綁定比過濾器更早發生
是否有任何理由,我簡直不明白爲什麼MVC請求處理管道的設計,使模型綁定應該發生在過濾器之前?
在asp.net mvc3中,授權過濾器在模型綁定之前執行,而不是在之後執行(請參閱下面的代碼)。
模型綁定發生在過濾器之前,因爲ActionExecutingContext(IActionFilter.OnActionExecuting的參數)包含動作的參數。也許他們應該懶加載這些參數。
以下代碼來自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
}