Постоянство объекта (между постбеками) в ASP.NET - PullRequest
1 голос
/ 03 января 2011

Я нахожусь в процессе разработки довольно большого веб-приложения. Несколько уровней доступа были определены через ASP.NET Членство и Ролевые провайдеры. У отдельных пользователей также есть профили (которые я расширил, включив в них различную произвольную информацию).

Вопрос в том, как сохранить пользователя между постами?

Я мог бы использовать что-то вроде HttpContext.Current для хранения пользователя, но его продолжительность жизни только от одного пост-к другому. Насколько я понимаю, мне нужно будет извлечь пользовательский объект в начале постбека (OnInit / PageLoad) и затем вернуть его обратно в HttpContext в конце каждого постбека. Кажется, неэффективно.

(Интересно, смогу ли я сделать это с помощью HttpModule?)

Кроме того, несмотря на то, что в ASP.NET есть статический экземпляр CurrentUser, он просто является обычным пользователем. Мне нужно нести весь профиль (который я создал в SQL).

Напомним, вопрос: а) возможно ли расширить статический экземпляр CurrentUser, заданный ASP.NET, так, чтобы он передавал произвольную информацию при сохранении через обычные каналы? Если Нет, как я могу сохранить такую ​​статическую информацию на протяжении всего сеанса пользователя (до тех пор, пока пользователь не выйдет из системы или не произойдет событие Session Expire / Timeout в global.asax)?

Любая помощь будет принята с благодарностью! Спасибо! bleepzter

Ответы [ 2 ]

3 голосов
/ 03 января 2011

Используйте IHttpModule, который подключается к PostAuthenticateRequest, затем сохраните вашего пользователя в 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;
    }
}
0 голосов
/ 03 января 2011

Я предполагаю, что мотивация для этого - производительность? В этом случае ответом обычно является «Кэш». Однако, если вы запускаете «довольно большое веб-приложение» без SessionsState, я предполагаю, что вы планируете использовать веб-ферму, что означает, что вы, вероятно, вместо этого внедрите memcached. Итак, в основном, создайте некоторый объект с отложенной загрузкой, который извлекает информацию из вашего кэша и сохраняет ее в HttpContext.Current. Следующий запрос повторите процесс.

Мое последнее предложение - просто позволять ему извлекать данные из базы данных при каждом запросе ... он может работать достаточно хорошо, не перепрыгивая через все эти обручи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...