ASP.NET - Javascript timeOut Предупреждение на основе sessionState timeOut в web.config - PullRequest
3 голосов
/ 11 августа 2011

Проблема: я пытаюсь создать предупреждение о превышении времени ожидания на странице asp.net с кодом ac # на основе моего атрибута sessionState TimeOut webconfig.

Код на 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>

Ответы [ 6 ]

2 голосов
/ 07 июня 2012

Мне не удалось заставить код FishbasketGordo работать, потому что вызов веб-метода продолжал передавать логическое значение "false" в качестве метода 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
                );
            });
2 голосов
/ 11 августа 2011

Псевдокод:

  • Считайте настройку тайм-аута в коде позади
  • Зарегистрировать блок 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 голос
/ 07 сентября 2012

Попробуйте Оповещение с использованием Jquery из моего блога:

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

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

<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>
1 голос
/ 11 августа 2011

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

<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 голос
/ 11 августа 2011

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

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

[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 в обратном вызове, который указывает, что истекло время ожидания, и предпринимает соответствующее действие.

...