【问题标题】:PostAuthenticateRequest fires several timesPostAuthenticateRequest 触发多次
【发布时间】:2010-07-07 14:56:23
【问题描述】:

我有表单身份验证,我需要将自定义对象存储在 HttpContext.Current.User 和 Thread.CurrentPrincipal 中。

为此,我监听 PostAuthenticateRequest 事件,然后从数据库中读取我需要存储在 HttpContext.Current.User 和 Thread.CurrentPrincipal 中的所有用户数据,然后实例化自定义 IPrincipal 和 IIdentity 对象并分配它们到上述地点。

问题在于,出于某种原因,PostAuthenticateRequest 会为单个请求触发多次。这会导致不必要的数据库往返,从而损害性能。

我应该如何解决这个问题? (ASP.NET MVC 2)

谢谢。

【问题讨论】:

    标签: asp.net asp.net-mvc-2


    【解决方案1】:

    您确定它会针对一个请求运行多次吗?请记住,页面上引用的每个资源(例如图像和样式表)都会触发此事件,因为它们被视为单独的请求。最好建议您短暂缓存自定义对象并检查它们是否存在于缓存中,如果不存在则仅访问数据库。

    您需要对缓存实施一些锁定,因为这些请求通常非常靠近。

    【讨论】:

    • 哦,是的!资源之类的东西让我忘记了!!!感谢您的复习!我已经考虑过缓存。但它也有影响。例如,我从数据库中读取并存储在 Principal 用户的权限中。如果管理员决定更改用户的权限,将它们放在缓存中并不是一个好主意 - 缓存用户的权限在用户注销/登录之前不会更新。需要尝试使用“简短”缓存来尝试您的想法。看起来它应该符合要求.. 非常感谢!
    • 您可以在 Page_Init 上更新当前用户的缓存。然后每个页面请求只会从数据库重新加载一次。这将始终在请求任何其他资源之前发生,因为该页面尚未呈现。
    • @Daniel Dyson,感谢您的支持。那么,Application_PostAuthenticateRequest() 是否总是会被每个资源调用来加载???
    • @Deepak 是的,这是我的理解,尽管自发布此原始帖子以来我还没有做过任何网络表单。我记得通过 asp.net 管道提供的每个资源请求都将进行身份验证。您可以使用测试页面轻松地对此进行测试,这些资源包括图像、js 和 css 文件等一些已知资源,然后在 Application_PostAuthenticateRequest() 处理程序中设置断点。数一数它被击中的次数,你就有答案了。
    • @Daniel Dyson,好主意。启发。谢谢。
    【解决方案2】:

    只需使用 web.config 中的标记从脚本、css 和图像目录中删除任何身份验证。例如:

    <system.web>
    ...
    </system.web>
    
    <location path="~/Scripts">
       <system.web>
          <authorization>
             <allow users="*"/>
          </authorization>
       </system.web>   
    </location>
    

    【讨论】:

    • 无论您是否访问被限制的页面,它都不会在每个请求上触发此事件。
    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多