C# ASP.NET-基于web.config中sessionState timeOut的Javascript超时警告

C# ASP.NET-基于web.config中sessionState timeOut的Javascript超时警告,c#,javascript,session-state,session-timeout,C#,Javascript,Session State,Session Timeout,问题:我希望在asp.net页面上根据我的webconfig sessionState TimeOut属性创建一条超时警告消息,并使用c#代码隐藏 web.config上的代码: 我以前通过在代码隐藏文件中创建一个web方法来检查超时,从而完成了这项工作。让Javascript函数通过AJAX获取超时信息,并根据这些信息显示警告 示例 这是我的代码隐藏中的web方法: [WebMethod] public static bool HasSessionTimedOut() { HttpSe

问题:我希望在asp.net页面上根据我的webconfig sessionState TimeOut属性创建一条超时警告消息,并使用c#代码隐藏

web.config上的代码:


我以前通过在代码隐藏文件中创建一个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> 

$(函数(){
var callback=函数(isTimeout){
如果(isTimeout){
//在这里显示您的弹出窗口。。。
}                         
};                                                         
设定间隔(
函数(){
//不要忘记在ScriptManager上设置EnablePageMethods=“true”。
HasSessionTimedOut(false,回调);
},                                                     
30000
);                                                          
});                                                            
所以,这是相当基本的。每30秒,我的Javascript函数使用ASP.NET的PageMethods对象向我的web方法发送一个AJAX请求。它在回调中检查返回值true,该值指示超时已发生,并采取相应的操作。

伪代码:

  • 读取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);
    }
当然,您可以通过显示警告弹出窗口或确认弹出窗口来改进客户端显示(而不是显示警报),然后您可以使用确认弹出窗口来续订会话。

尝试此解决方案(需要脚本管理器):


//抓住计时器
var iddleTimeoutWarning=null;
var iddleTimeout=null;
//加载页面并完成部分回发后,ASP.NET AJAX将自动调用此函数
函数pageLoad(){
//从以前的回发中清除所有旧计时器
if(iddleTimeoutWarning!=null)
clearTimeout(iddleTimeOverWarning);
if(iddleTimeout!=null)
clearTimeout(iddleTimeout);
//从web.config读取时间
var millisectimeoverning=;
var millisecTimeOut=;
//设置超时以在用户处于非活动状态时显示警告
IDDLETIMEOWWARNING=setTimeout(“displaydledwarning()”,MilliSecTimeOWWARNING);
iddleTimeout=setTimeout(“TimeoutPage()”,millisecTimeOut);
}
函数displaydlewarning(){
警报(“由于不活动,您的会话即将过期。”);
}
函数TimeoutPage(){
//刷新页面对于这个示例,我们可以重定向到另一个页面,该页面包含清除会话变量的代码
location.reload();
}

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


var sessionTimeoutWarning=“”;
var sessionTimeout=“”;
var sTimeout=parseInt(sessionTimeoutWarning)*60*1000;
setTimeout('SessionWarning()',sTimeout);
函数SessionWarning()
{
var message=“您的会话将在另一个”+(parseInt(sessionTimeout)-parseInt(sessionTimeoutWarning))+“分钟内到期!请在会话到期前更新数据”;
警报(信息);
}
我将警告消息的频率设置为每20分钟一次,并通过将其作为变量置于应用程序设置下使其易于更改,应用程序设置也可以在web.config中访问,并定义为键(SessionWarning),w/a值为20(代表20分钟)

以下是我在web.config文件中使用的代码:


我无法使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
                );
            });
从我的博客上试试这个:

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

AJAX与Javascript相比不是什么好东西。这是一种Javascript技术。我会做一个例子。如果你愿意看的话,我已经在我的答案中添加了一个例子。谢谢你的例子和回复!实际上,对web方法的调用似乎是连续的
            $(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
                );
            });