【发布时间】:2009-11-16 19:18:43
【问题描述】:
a) 当前用户第一次访问 Profile 对象时,Asp.Net 检索该用户的完整配置文件还是在调用时检索配置文件属性?
b) 在任何情况下,当前用户的配置文件数据是在每次调用时从 DB 中检索,还是仅检索一次,然后在当前请求期间保存?
感谢
【问题讨论】:
a) 当前用户第一次访问 Profile 对象时,Asp.Net 检索该用户的完整配置文件还是在调用时检索配置文件属性?
b) 在任何情况下,当前用户的配置文件数据是在每次调用时从 DB 中检索,还是仅检索一次,然后在当前请求期间保存?
感谢
【问题讨论】:
您没有指定这是网站项目还是 Web 应用程序项目;配置文件有很大的不同,因为它们不是针对 Web 应用程序项目模板开箱即用的:
http://codersbarn.com/post/2008/07/10/ASPNET-PayPal-Subscriptions-IPN.aspx
http://leedumond.com/blog/asp-net-profiles-in-web-application-projects/
您是否已经真正实施了它,或者您只是处于规划阶段?如果是后者,那么上面的链接应该提供一些有价值的信息。至于缓存问题,我会接受 Dave 的建议。
【讨论】:
如果您想保存数据库调用,您可以使用实用程序方法来缓存配置文件,或者您可以实现自己的自定义 MembershipProvider 来处理缓存。
在这种情况下,实用程序方法可能是最简单的解决方案,除非您想要实现其他功能,这将通过实现自定义 MembershipProvider 来提供。
您可以参考此链接了解更多详情: How can I access UserId in ASP.NET Membership without using Membership.GetUser()?
这是一个执行缓存的实用方法示例。你可以传递一个slidingMinutesToExpire,让它在一段时间后从缓存中过期,以避免在你有很多用户的情况下消耗过多的服务器内存。
public static void AddToCache(string key, Object value, int slidingMinutesToExpire)
{
if (slidingMinutesToExpire == 0)
{
HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.NotRemovable, null);
}
else
{
HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(slidingMinutesToExpire), System.Web.Caching.CacheItemPriority.NotRemovable, null);
}
}
【讨论】: