【问题标题】:Object persistence (between post-backs) in ASP.NETASP.NET 中的对象持久性(回发之间)
【发布时间】:2011-01-03 20:25:06
【问题描述】:

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

问题是如何在回发之间保留用户?

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

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

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

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

任何帮助将不胜感激! 谢谢! 噼里啪啦

【问题讨论】:

  • 我忘了说我不能使用会话状态或视图状态。

标签: asp.net webforms


【解决方案1】:

使用挂钩到 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;
    }
}

【讨论】:

  • 谢谢!我有两个问题。什么是 IMyPrincipal?和我的校长?
  • 好吧,没关系,我查了一下 - 它是实际的 PrincipalPermission 对象。
  • @bleepzter,是的,这些 Principal 将是您对 ASP.NET 提供给您的内置 IPrincipal 的扩展
  • 这似乎是部分答案。您缺少的一半是整个MyPrincipal 部分。一个简短的描述就足够了。
【解决方案2】:

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

我的最终建议是让它在每次请求时都从数据库中提取...它可能会表现得足够好,而无需跳过所有这些环节。

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    相关资源
    最近更新 更多