6

我只是 ASP.NET MVC 的新手,不确定如何以“正确的方式”完成某项任务。

本质上,我将登录的 userId 存储在 HttpContext.User.Identity 中,并编写了一个EnhancedAuthorizeAttribute来执行一些自定义授权。

在覆盖的OnAuthorization方法中,我的域模型命中数据库以确保当前用户 id 可以访问传入的 routeValue "BatchCode"。原型是:

ReviewGroup GetReviewGroupFromBatchCode(string batchCode);

如果用户无法访问 ReviewGroup 并且 OnAuthorization 拒绝访问,它将返回 null。

现在,我知道装饰操作方法只有在 OnAuthorization 通过时才会执行,但我不想再次访问数据库以再次获取 ReviewGroup。

我现在正在考虑将 ReviewGroup 存储在控制器中HttpContext.Items["reviewGroup"]并从控制器中访问它。

这是一个可行的解决方案,还是我走错了路?

谢谢!

4

3 回答 3

1

或者,避免访问数据库的最佳方法之一,也是最简单的方法之一是缓存。取回它,将其保存在缓存中。如果再次需要它,它已经在内存中,不需要数据库命中。如果不是,那么当缓存超出范围时,对象也会超出范围。

于 2010-05-19T14:27:18.267 回答
1

HttpContext.Items 仅在请求期间有效。如果你想坚持更长的时间,你应该把它放在

a) 会话 - 好

b) 简介 - 看不到优势

c) cookie - 不推荐

d) 每次都访问数据库 - 应该没问题

将其存储在 filterContext.RouteData.DataTokens 中?

于 2010-05-14T02:03:16.523 回答
0

除非您进行了非常大的选择,ReviewGroup或者您拥有庞大的数据库,否则第二次数据库命中不会是太大的问题。现代数据库在进行选择方面非常有效,尤其是在正确索引表的情况下。

根据我的经验,这是进行授权的最佳方式,并且与我在应用程序中授权特定操作的方式类似。

所以简而言之,我完全不用担心第二次数据库命中。

于 2010-05-14T02:56:59.443 回答