2010-05-17 2 views
3

Я хочу создать способ автоматического перенаправления пользователей на Timeout.aspx, когда их сеанс истекает из-за неактивности. Мое приложение использует проверку подлинности форм и в значительной степени полагается на панели обновлений на одной и той же странице aspx для взаимодействия с пользователем, поэтому я не хочу просто перенаправлять после истечения таймера уровня страницы. По той же причине я не могу использовать «< META HTTP-эквив =„обновить“/ >»Переадресация тайм-аута сеанса на стороне клиента в ASP.Net

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

+0

Существует не чистый или правильный путь что-то вроде этого. Назовите это «артефактом архитектуры» ... – StingyJack

+0

@all - есть чистый и правильный способ справиться с этой проблемой. Вам просто нужно взглянуть под другим углом. –

ответ

9

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

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

Это позволяет проводить интерактивный сеанс и оформлять билет на весь срок службы без, натыкаясь на сеанс или билет.

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

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

AsynchronousSessionAuditor 1.0

+0

Это выглядит очень многообещающе. Я никогда не думал о введении HttpModule в микс. Благодаря! –

+0

@ Меркурий - вы очень желанны. Я рад, что это может быть полезно. –

+0

@SkySanders Может ли ваш проект работать в сценариях Callback & Postback в состоянии сеанса asp.net, настроенном на StateServer? Если это так, я хочу обсудить. – Myra

0

Действительно ли критический момент, когда тайм-аут происходит, когда заканчивается сессия сервера ?

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

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

+0

Хорошее решение, но я думаю, что он ломается, если у пользователя есть несколько вкладок или окон. Фоновая вкладка может привести к неожиданному выходу из системы. –

0

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

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

+0

Это хорошая мысль ... к сожалению, она, похоже, доступна только в .Net 4.0, и я нацелен на 3.5. –

+0

Я ориентирую .NET 4.6. Вы пробовали это и действительно ли это работает? –

0

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

+0

Обработка возвращаемых значений ajax будет недостаточной, так как мне нужно, чтобы браузер автоматически перенаправлял Timeout.aspx после периода бездействия, например, когда пользователь встает и уходит от компьютера. В этом случае не будет никаких аякс-вызовов на сервере. –

2

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

Нечто похожее на это живет на моей главной странице. Последняя строка 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> 
Смежные вопросы