2011-01-03 1 views
1

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

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

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

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

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

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

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

+0

Я забыл упомянуть, что не могу использовать Session State или View State. – bleepzter

ответ

3

Используйте 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

Спасибо! У меня есть два вопроса. Что такое IMyPrincipal? и MyPrincipal? – bleepzter

+0

+1 Это аккуратный трюк. Я всегда забываю о Http-модулях. – Greg

+0

Хорошо, конечно, я посмотрел - это фактический объект PrincipalPermission. – bleepzter

0

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

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

Смежные вопросы