2012-12-07 52 views
9

से पहले क्यों होता है साइमन द्वारा इस उत्कृष्ट ब्लॉग post पर जाने के बाद मुझे पता चला कि मॉडल बाध्यकारी फिल्टर निष्पादन (प्राधिकरण फ़िल्टर से पहले भी) से पहले होती है। अगर अनुरोध अधिकृत नहीं है तो इसे यथासंभव पहले अस्वीकार कर दिया जाना चाहिए और उस स्थिति में मैं मॉडल बाध्यकारी प्रक्रिया से पहले प्राधिकरण फ़िल्टर चलाने को प्राथमिकता देता हूं। इसके अलावा, इस तरह से हम अनुरोध स्कैनिंग से बचने, मॉडल के उदाहरण बनाने और सत्यापन करने से बचने का समय बचा सकते हैं।फ़िल्टर बाध्यकारी फ़िल्टर

क्या कोई कारण नहीं है कि मुझे समझ में नहीं आता कि एमवीसी अनुरोध प्रसंस्करण पाइपलाइन इस तरह से डिज़ाइन की गई है कि मॉडल बाध्यकारी फ़िल्टर से पहले क्यों होनी चाहिए?

उत्तर

7

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 
}