我有Forms身份验证,我需要一个自定义对象存储在HttpContext.Current.User和Thread.CurrentPrincipal中。
为了得到这个,我听PostAuthenticateRequest事件,然后从DB中读取我需要存储在HttpContext.Current.User和Thread.CurrentPrincipal中的所有用户数据,然后我实例化自定义IPrincipal和IIdentity对象并分配它们到上述地点。
问题在于,由于某种原因,PostAuthenticateRequest会针对单个请求多次触发..这会导致不必要的数据库往返,从而影响性能。
我该如何解决这个问题? (ASP.NET MVC 2)
感谢。
答案 0 :(得分:5)
您确定单个请求是否多次运行?请记住,页面上引用的每个资源(如图像和样式表)都会触发此事件,因为它们被视为单独的请求。建议您最好快速缓存自定义对象并检查它们是否存在于缓存中,如果不存在则仅访问数据库。
您需要在缓存上实现一些锁定,因为这些请求通常非常接近。
答案 1 :(得分:1)
只需使用web.config中的标记即可从脚本,css和图像目录中删除任何身份验证。例如:
<system.web>
...
</system.web>
<location path="~/Scripts">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>