Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net PostAuthenticateRequest激发多次_Asp.net_Asp.net Mvc 2 - Fatal编程技术网

Asp.net PostAuthenticateRequest激发多次

Asp.net PostAuthenticateRequest激发多次,asp.net,asp.net-mvc-2,Asp.net,Asp.net Mvc 2,我有表单身份验证,需要将自定义对象存储在HttpContext.Current.User和Thread.CurrentPrincipal中 为了实现这一点,我先侦听PostAuthenticateRequest事件,然后从DB中读取需要存储在HttpContext.Current.user和Thread.CurrentPrincipal中的所有用户数据,然后实例化自定义IPrincipal和IIdentity对象,并将它们分配到上述位置 问题在于,出于某种原因,PostAuthenticateR

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

为了实现这一点,我先侦听PostAuthenticateRequest事件,然后从DB中读取需要存储在HttpContext.Current.user和Thread.CurrentPrincipal中的所有用户数据,然后实例化自定义IPrincipal和IIdentity对象,并将它们分配到上述位置

问题在于,出于某种原因,PostAuthenticateRequest会为一个请求触发多次。。这会导致不必要的DB往返,从而影响性能

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


谢谢。

您确定一个请求会运行多次吗?请记住,页面上引用的每个资源(如图像和样式表)都会触发此事件,因为它们被视为单独的请求。建议您简要缓存自定义对象,并检查它们是否存在于缓存中,如果不存在,则只转到DB


您需要在缓存上实现一些锁定,因为这些请求通常发生在非常近的位置。

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

<system.web>
...
</system.web>

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

...

哦,是的!有资源的东西等我都忘了!!!谢谢你的复习!我已经考虑过缓存了。但这也会带来影响。例如,我从数据库读取数据并存储在主体用户的权限中。如果管理员决定更改用户的权限,将它们放在缓存中不是一个好主意-缓存用户的权限在用户注销/登录之前不会更新。。需要尝试使用“简短”缓存的想法。看起来它应该符合要求。。谢谢!您可以在页面_Init上更新当前用户的缓存。然后,每个页面请求只能从数据库中重新加载一次。这将始终在请求任何其他资源之前发生,因为页面尚未呈现。@Daniel Dyson,感谢您的支持。那么,应用程序_PostAuthenticateRequest()是否会一直被调用以加载每一个资源?@Deepak是的,这是我的理解,尽管自从这篇原始文章发表以来,我没有做过任何webforms。我记得,通过asp.net管道服务的每个资源请求都将进行身份验证。您可以使用测试页面、大量已知资源(如图像、js和css文件)轻松地测试这一点,然后在应用程序\u PostAuthenticateRequest()处理程序中设置断点。数一数它被击中的次数,你就有了答案。@Daniel Dyson,好主意。受到启发的谢谢。无论您访问的页面是否被重新限制,这都无助于在每次请求时触发此事件。