ASP.NET中的对象持久性(回发之间)

时间:2011-01-03 20:25:07

标签: asp.net webforms

我正在开发一个非常大的网络应用程序。通过ASP.NET成员资格和角色提供程序定义了多个访问级别。个人用户也有个人资料(我已将其扩展为包含各种任意信息)。

问题是我如何在回发之间坚持用户?

我可以使用像HttpContext.Current这样的东西来存储用户,但它的生命周期只能从一个回发到另一个。我的理解是,我必须在post-back(OnInit / PageLoad)的开头检索用户对象,然后在每个post-back结束时将其放回HttpContext中。似乎有点低效。

(我想知道我是否可以用HttpModule做到这一点?)

此外,即使ASP.NET中存在静态CurrentUser实例,它也只是一个通用用户。我需要携带整个配置文件(我在SQL中创建)。

回顾一下,问题是:a)是否可以扩展ASP.NET提供的静态CurrentUser实例,以便在通过正常通道保持时它会携带任意信息?如果否,我如何在用户会话期间保持此类静态信息(直到用户注销,或者global.asax触发了Session Expire / Timeout事件)?

任何帮助将不胜感激! 谢谢! bleepzter

2 个答案:

答案 0 :(得分:3)

使用挂钩到PostAuthenticateRequest的IHttpModule,然后将您的用户存储在HttpContext.Current.User

示例:

public class MyModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PostAuthenticateRequest += PostAuthenticateRequest;
    }

    private void PostAuthenticateRequest(object sender, EventArgs e)
    {
        var app = (HttpApplication)sender;
        var httpContext = app.Context;
        IMyPrincipal principal = null;

        principal = new MyPrincipal(httpContext.User.Identity);

        httpContext.User = principal;
    }
}

答案 1 :(得分:0)

我认为这是表现的动机?在这种情况下,答案通常是“缓存”。但是,如果您在没有SessionsState的情况下运行“相当大的Web应用程序”,我猜您正在计划Web场,这意味着您可能会实现memcached。因此,基本上,创建一些延迟加载对象,从缓存中提取信息并将其存储在HttpContext.Current中。下一个请求,重复过程。

我的最后建议是在每次请求时让它从数据库中拉出来...它可能表现得很好而不会跳过所有这些箍。