gpt4 book ai didi

c# - 解释 MVC 授权属性如何执行类似 AOP 的操作

转载 作者:太空狗 更新时间:2023-10-29 23:07:51 25 4
gpt4 key购买 nike

我一直在试图弄清楚这是如何在低层次上工作的:

[Authorize]
public ActionResult Index()
{
return View();
}

基本上,上面的代码片段似乎拦截了对 Index 方法的调用,执行授权检查,如果未授权则抛出异常。该异常阻止 Index 方法中的代码被调用。

这看起来很像 AOP,并且在 C# 中不容易完成。如果我要实现我自己的扩展 System.Attribute 的类,我将没有任何接口(interface)可以 Hook 到我的属性装饰的方法的调用前或调用后。那么 MVC Authorize 属性是如何做到这一点的,我又该如何自己做到呢?

PostSharp 是一个使用 IL Weaving 完成同样事情的库。基本上,在编译时,PostSharp 会扫描程序集以查找使用某些属性修饰的方法,然后重写您的代码以使用其他方法调用包装您的方法调用。

MVC 框架是否也在编译时执行某种 IL Weaving?我可以执行自己的 IL Weaving 吗?或者是否有其他技术无需复杂的 IL Weaving 即可应用相同的 AOP 原则?

我试图查找有关 IL Weaving 的信息,但我找到的都是有关 PostSharp 的文章。由于许可方面的麻烦,我宁愿远离 PostSharp,但此外,我只想知道他们到底是如何为我作为开发人员的成长而做到的。这很有趣。

最佳答案

了解它的最简单方法是查看源代码。

一个基本的解释是 mvc Controller 不像 instance.method 那样被简单地调用(在这种情况下你需要 postsharp 来使属性以相同的方式工作)

有一个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);
}

关于c# - 解释 MVC 授权属性如何执行类似 AOP 的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21289080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com