2011-08-11 2 views
3

Проблема: Я ищу, чтобы создать предупреждающее сообщение с тайм-аутом на странице asp.net с кодом C#, основанным на моем веб-конфиге sessionState TimeOut Attribute.ASP.NET - Javascript timeOut Предупреждение, основанное на sessionState timeOut в web.config

Код на web.config:

<configuration> 
    <system.web> 
     <sessionState timeout="20"></sessionState> 
    </system.web> 
</configuration> 
<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="EchoSignDocumentService10HttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="6553600" maxBufferPoolSize="524288" maxReceivedMessageSize="6553600" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="1638400" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <security mode="Transport"> 
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
       </security> 
      </binding> 
      <binding name="EchoSignDocumentService10HttpBinding1" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <security mode="None"> 
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
</system.serviceModel> 

ответ

1

Я сделал это раньше, создав веб-метод в моем файл кода, который проверяет тайм-аут. Пусть ваша функция Javascript получит информацию о тайм-ауте через AJAX и отобразит предупреждение.

Пример

Это веб-метод в моем коде-за:

[WebMethod] 
public static bool HasSessionTimedOut() 
{ 
    HttpSessionState session = HttpContext.Current.Session; 

    // I put this value into Session at the beginning. 
    DateTime? sessionStart = session[SessionKeys.SessionStart] as DateTime?; 

    bool isTimeout = false; 

    if (!sessionStart.HasValue) 
    { 
     isTimeout = true; 
    } 
    else 
    { 
     TimeSpan elapsed = DateTime.Now - sessionStart.Value; 
     isTimeout = elapsed.TotalMinutes > session.Timeout; 
    } 

    return isTimeout; 
} 

И это мой Javascript:

<script type="text/javascript">         
    $(function() {             
     var callback = function(isTimeout) { 
      if (isTimeout) {       
       // Show your pop-up here... 
      }       
     };               
     setInterval(            
      function() { 
       // Don't forget to set EnablePageMethods="true" on your ScriptManager. 
       PageMethods.HasSessionTimedOut(false, callback);  
      },              
      30000             
     );               
    });                
</script> 

Таким образом, это довольно рудиментарным. Каждые 30 секунд моя функция Javascript отправляет запрос AJAX на мой веб-метод с использованием объекта PageMethods ASP.NET. Он проверяет возвращаемое значение true в обратном вызове, что указывает на то, что тайм-аут произошел, и предпринимает соответствующие действия.

+0

AJAX - это не то, что вы используете против Javascript. Это метод Javascript. Я буду работать на примере. – FishBasketGordo

+0

Я добавил пример моего ответа, если вы хотите взглянуть. – FishBasketGordo

+0

Спасибо за пример и ответ! –

2

Псевдо код:

  • Прочитайте тайм-аут установки в коде
  • Зарегистрируйте ClientScriptblock (setTimeout прохождения периода тайм-аута (20 * 60))
  • По истечении времени ожидания отображается предупреждающий ярлык на странице

Пример кода:

public void RegisterTimeoutWarning(System.Web.UI.Page Page) 
    { 
     var timeout = HttpContext.Current.Session.Timeout * 60 * 1000; 
     Page.ClientScript.RegisterStartupScript(Page.GetType(), 
       "timeoutWarning", 
       string.Format("setTimeout(function() {{ alert('Session about to expire'); }}, {0});", timeout), true); 
    } 

Конечно, вы можете улучшить отображение на стороне клиента (а не показывать предупреждение), отображая всплывающие окна с предупреждением или даже всплывающее окно подтверждения, которое затем можно использовать для возобновления сеанса.

1

Попробуйте это решение (требуется менеджер сценария):

<script type="text/javascript"> 

    //get a hold of the timers 
    var iddleTimeoutWarning = null; 
    var iddleTimeout = null; 

    //this function will automatically be called by ASP.NET AJAX when page is loaded and partial postbacks complete 
    function pageLoad() { 

     //clear out any old timers from previous postbacks 
     if (iddleTimeoutWarning != null) 
      clearTimeout(iddleTimeoutWarning); 
     if (iddleTimeout != null) 
      clearTimeout(iddleTimeout); 
     //read time from web.config 
     var millisecTimeOutWarning = <%= int.Parse(System.Configuration.ConfigurationManager.AppSettings["SessionTimeoutWarning"]) * 60 * 1000 %>; 
     var millisecTimeOut = <%= int.Parse(System.Configuration.ConfigurationManager.AppSettings["SessionTimeout"]) * 60 * 1000 %>; 

     //set a timeout to display warning if user has been inactive 
     iddleTimeoutWarning = setTimeout("DisplayIddleWarning()", millisecTimeOutWarning); 
     iddleTimeout = setTimeout("TimeoutPage()", millisecTimeOut); 
    } 

    function DisplayIddleWarning() { 
     alert("Your session is about to expire due to inactivity."); 
    } 

    function TimeoutPage() { 
     //refresh page for this sample, we could redirect to another page that has code to clear out session variables 
     location.reload(); 
    } 

</script> 
1

Я создал тайм-аут, предупреждающий сообщение askign пользователя для сохранения данных до времени сеанса в й количестве оставшихся минут, используя следующий JavaScript код на моей странице edit.aspx asp.net:

<script language="javascript" type="text/javascript"> 
    var sessionTimeoutWarning = "<%= System.Configuration.ConfigurationSettings.AppSettings["SessionWarning"].ToString()%>"; 
    var sessionTimeout = "<%= Session.Timeout %>"; 

    var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000; 
    setTimeout('SessionWarning()', sTimeout); 

    function SessionWarning() 
    { 
     var message = "Your session will expire in another " + (parseInt(sessionTimeout) - parseInt(sessionTimeoutWarning)) + " mins! Please Update the data before the session expires"; 
     alert(message); 
    } 
</script> 

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

Вот код, который я использовал в моем файле web.config:

<configuration> 
    <appSettings> 
     <add key="SessionWarning" value="20" /> 
     <add key="EchoSignApiKey" value="XZKZ3VT2M*****" /> 
     <add key="EchoSignSignedDocumentUrl" value="http://echosign:*****.Com/ApplicationFiles/" /> 
     <!-- dummy --> 
     <add key="ImageSaveFolder" value="C:\Development\Temp" /> 
     <add key="FileSaveFolder" value="C:\Development\Temp" /> 
     <!-- Test Library--> 
     <add key="AS400LIBRARY" value="TPATSTDTA" /> 
     <add key="AllowVoiceSignature" value="False" /> 
    </appSettings> 
    <system.web> 
     <sessionState timeout="60" /> 
    </system.web> 
    <system.serviceModel> 
     <bindings> 
      <basicHttpBinding> 
       <binding name="EchoSignDocumentService10HttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="6553600" maxBufferPoolSize="524288" maxReceivedMessageSize="6553600" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="1638400" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <security mode="Transport"> 
         <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
       <binding name="EchoSignDocumentService10HttpBinding1" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <security mode="None"> 
         <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
    </system.serviceModel> 
</configuration> 
2

я не смог получить код FishbasketGordo, чтобы работать, потому что вызов веб-метода хранится передавая логическое значение «ложь», как OnSuccess метод , После долгих исследований я внес следующие изменения.

  $(function() { 
       var isTimeout = false; 
       var callback = function (isTimeout) { 
        if (isTimeout) { 
         // Show your pop-up here... 
         alert("You have timed out"); 
        } 
       }; 

       var failure = function() { 
        alert("Problem with Server"); 
       }; 

       setInterval(
         function() { 
          // Don't forget to set EnablePageMethods="true" on your ScriptManager. 
          PageMethods.HasSessionTimedOut(callback,failure); 
         }, 30000 
       ); 
      }); 
+1

На самом деле, похоже, что вызов веб-метода продолжает сеанс. У меня было уведомление о времени на одной странице, которое задает переменную сеанса при первой загрузке страницы, а затем кнопка откроет вторую страницу в том же сеансе. На второй странице была кнопка, которая проверяла наличие переменной сеанса и обновляла метку, если она существовала или перенаправлялась на страницу тайм-аута, если нет. Каждый раз, когда уведомление о тайм-ауте сообщало о том, что сеанс был исчерпан, кнопка сообщила, что переменная сеанса все еще существует, что указывает на то, что сеанс фактически не был отключен. – user1161391

1

Try This Seesion Alert Using Jquery из моего блога:

  • Session установлен тайм-аут (например, 30 минут).
  • Когда сеанс заканчивается, пользователь выходит из системы.
  • Отображение обратного отсчета, чтобы пользователь знал, сколько времени осталось.
  • Сообщите пользователю, когда он приближается к пределу (например, 5 минут слева).
  • Сообщите пользователю, что они были автоматически отключены из-за неактивности.