我一直在试图弄清楚这在低层次上是如何运作的:
[Authorize]
public ActionResult Index()
{
return View();
}基本上,上面的代码片段似乎拦截对Index方法的调用,执行授权检查,如果没有授权则抛出和异常。异常将防止调用Index方法中的代码。
这看上去很像AOP,而且在C#中做起来并不容易。如果我要实现扩展System.Attribute的自己的类,我就没有任何接口可以连接到我的属性修饰的方法的前后调用。那么MVC授权属性是如何做到这一点的,我如何才能独自完成它呢?
PostSharp是一个使用IL编织完成相同功能的库。基本上,在编译时,PostSharp扫描程序集以查找带有特定属性的方法,然后重写代码,将方法调用与其他方法调用包装起来。
MVC框架也在编译时执行某种IL编织吗?我可以自己做IL编织吗?还是有其他技术可以应用相同的AOP原理而不需要复杂的IL编织?
我试图找到关于IL编织的信息,但我发现的都是关于PostSharp的文章。我宁愿远离PostSharp,因为许可证问题,但我只是想知道,他们是如何为我自己的发展,作为一个开发人员。很吸引人。
发布于 2014-01-22 17:38:07
理解它的最简单的方法是查看源代码。
一个基本的解释是,mvc控制器的调用并不像instance.method那样简单(在这种情况下,您需要后置锐利才能使属性以相同的方式工作)
有一个ControllerActionInvoker,它具有以下方法
public virtual bool InvokeAction(ControllerContext controllerContext, string actionName)
{
...
// get all the filters (all that inherit FilterAttribute), inlcuding the authorize attribute
FilterInfo filterInfo = GetFilters(controllerContext, actionDescriptor); 首先,继承IAuthorizationFilter的所有过滤器都在执行(Authorize, ValidateAntiForgeryToken)之后,如果auth成功了,其余的就会执行。
AuthorizationContext authContext = InvokeAuthorizationFilters(controllerContext, filterInfo.AuthorizationFilters, actionDescriptor);
//authContext.Result has value if authorization didn't succeed
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);
}
IDictionary<string, object> parameters = GetParameterValues(controllerContext, actionDescriptor);
//invoke the action with filters here
ActionExecutedContext postActionContext = InvokeActionMethodWithFilters(controllerContext, filterInfo.ActionFilters, actionDescriptor, parameters);
InvokeActionResultWithFilters(controllerContext, filterInfo.ResultFilters, postActionContext.Result);
}https://stackoverflow.com/questions/21289080
复制相似问题