ASP.NET - Javascript timeOut警告基于web.config中的sessionState timeOut

时间:2011-08-11 16:06:18

标签: c# javascript session-state session-timeout

问题:我希望在asp.net页面上创建一个超时警告消息,其中c#代码基于我的webconfig sessionState TimeOut属性。

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 个答案:

答案 0 :(得分:2)

伪代码:

  • 读取codebehind
  • 中的超时设置
  • 注册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 :(得分:2)

我无法使FishbasketGordo的代码生效,因为Web方法调用不断传递布尔值“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 :(得分:1)

我之前通过在我的代码隐藏文件中创建一个检查超时的Web方法来完成此操作。让您的Javascript函数通过AJAX获取超时信息并显示警告。

示例

这是我的代码隐藏中的Web方法:

[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函数就会使用ASP.NET的PageMethods对象向我的web方法发送一个AJAX请求。它会在回调中检查返回值true,这表示发生了超时,并采取了相应的操作。

答案 3 :(得分: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>

答案 4 :(得分:1)

我在asp.net edit.aspx页面上使用以下javascript代码创建了一个超时警告消息,要求用户在会话超时x个剩余分钟数之前保存数据:

<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) w /值为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>

答案 5 :(得分:1)

从我的博客中尝试此Seesion Alert Using Jquery

  • 会话设置为超时(例如30分钟)。
  • 当会话超时时,用户将被注销。
  • 显示倒计时,以便用户知道剩余时间。
  • 当用户接近极限时(例如,还剩5分钟)通知用户。
  • 让用户知道他们因不活动而自动超时。