Тайм-аут перенаправления сеанса на стороне клиента в ASP.Net - PullRequest
3 голосов
/ 17 мая 2010

Я хочу создать способ автоматического перенаправления пользователей в Timeout.aspx, когда их сеанс истекает из-за неактивности. Мое приложение использует проверку подлинности с помощью форм и в значительной степени полагается на панели обновления в пределах одной страницы aspx для взаимодействия с пользователем, поэтому я не хочу просто перенаправлять после истечения таймера на уровне страницы. По той же причине я не могу использовать ''

Я хочу создать простой веб-сервис ajax с методом IsSessionTimedOut (), который просто возвращает логическое значение. Я буду использовать таймер javascript для периодического вызова метода, и если он вернет true, то перенаправить на Timeout.aspx. Однако я не хочу вызывать этот метод для сброса таймера тайм-аута сеанса, иначе сеанс никогда не истечет из-за вызова службы. Есть ли чистый способ избежать этой ловушки-22? Надеюсь, есть простое решение, которое до сих пор ускользнуло от меня.

Ответы [ 5 ]

9 голосов
/ 18 мая 2010

Суть проблемы заключается в том, что в приложениях AJAX для обеспечения надежного пользовательского интерфейса вы должны загромождать свой клиентский сценарий множеством кода, проверяющего состояние каждого вызова и определяющего, произошел ли сбой из-за устаревшего сеанса / заявки. Благодаря упреждающему подходу ваш клиентский сценарий может быть значительно упрощен и в то же время обеспечивает гораздо лучший пользовательский опыт.

Я специально разработал решение этой проблемы.

Это позволяет интерактивную сессию и аудит срока действия билета без повышения сеанса или билета.

Несколько браузеров / вкладок не проблема.

Забудьте солнцезащитный крем; Помните: когда вы делаете Ajax, будьте активны - вы должны отказаться от сеанса, сеанс не должен покинуть вас; -)

AsynchronousSessionAuditor 1.0

2 голосов
/ 18 мая 2010

Это лучшее решение, которое я придумал до сих пор, но я открыт для чего-то лучшего. По сути, у меня есть 15-минутный таймер JavaScript, который сбрасывается при каждой обратной передаче. Недостатком этого подхода является то, что вторая вкладка или окно, открытое в фоновом режиме, приведет к завершению сеанса, даже если пользователь активно использует приложение в другом окне браузера.

Нечто похожее на это живет на моей главной странице. В последней строке JavaScript добавлена ​​функция сброса, которая запускается при обновлении любой панели обновления:

        <asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Release" OnAsyncPostBackError="ScriptManager1_AsyncPostBackError">
        <Scripts >
            <asp:ScriptReference Path="~/scripts/jquery/jquery-1.3.2.min.js" />
        </Scripts>
        </asp:ScriptManager>

        <script type="text/javascript">

        var redirectTimer = setTimeout('redirectToLogout()', 900000);

        function redirectToLogout() {
            window.location = "/logout.aspx";
        }

        function ResetTimeoutTimer() {
            clearTimeout(redirectTimer);
            redirectTimer = setTimeout('redirectToLogout()', 900000);
        }


        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(ResetTimeoutTimer);

       </script>
0 голосов
/ 17 мая 2010

Я думаю, что если вы включите состояние сеанса для своего веб-сервиса, а затем установите SessionStateBehavior для чтения только в вашем global.asax, если веб-сервис подвергается удару, у вас все будет хорошо. Вам нужно будет сделать это в начале жизненного цикла.

http://msdn.microsoft.com/en-us/library/system.web.httpcontext.setsessionstatebehavior(v=VS.100).aspx

0 голосов
/ 18 мая 2010

Я думаю, что вы идете по этому пути неправильно ... Если вы абсолютно не можете использовать простое мета-обновление (безусловно, самый простой способ справиться с этим), тогда просто обработайте случаи, когда ваши AJAX-методы возвращают значения, которыеукажите, что время вашей сессии истекло.Зачем вам нужен дополнительный механизм, чтобы сделать это?Я не очень знаком с UpdatePanel ... но если обновление завершится неудачно, когда ваш сеанс истечет, вы, конечно, можете отослать какое-нибудь сообщение "Эй, пардон, вам нужно снова войти"?

0 голосов
/ 17 мая 2010

Действительно ли важно, чтобы тайм-аут произошел по истечении сеанса на стороне сервера ?

Если вы просто хотите заставить пользователей обновить свои сеансы или тайм-аут их, я бы использовал window.setTimeout (), чтобы перенаправить на Timeout.aspx после установленного времени. Код позади Timeout.aspx может вызвать Session.Abort (), чтобы завершить сеанс, что заставит пользователя снова войти в систему, если он хочет продолжить.

Я думаю, что этот метод на самом деле будет более точным и надежным, чем время ожидания сеанса, которое (по моему опыту) имеет тенденцию варьироваться в зависимости от нагрузки на сервер и других факторов.

...