Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET会话重定向而不回发_C#_Asp.net_Ajax_Session - Fatal编程技术网

C# ASP.NET会话重定向而不回发

C# ASP.NET会话重定向而不回发,c#,asp.net,ajax,session,C#,Asp.net,Ajax,Session,我在ASP.NET c.中有一个单页应用程序。应用程序中的所有信息都是通过AJAX调用加载的。根本没有POSTBACK。但是,每次我单击从webservices加载数据的不同菜单项时,它都会检查用户是否有有效的会话。由于没有postback,当session过期时,用户仍会看到主页面,当他们单击菜单项时,自会话过期后数据将不会加载(但用户不知道) 如果有postback,我确实知道在会话到期时如何重定向到登录页面,但是如果没有postback,我如何才能获得相同的结果?用户首先是如何登录的?如果

我在
ASP.NET c.
中有一个单页应用程序。应用程序中的所有信息都是通过
AJAX
调用加载的。根本没有
POSTBACK
。但是,每次我单击从
webservices
加载数据的不同菜单项时,它都会检查用户是否有有效的
会话。由于没有
postback
,当
session
过期时,用户仍会看到主页面,当他们单击菜单项时,自会话过期后数据将不会加载(但用户不知道)


如果有
postback
,我确实知道在会话到期时如何重定向到登录页面,但是如果没有
postback
,我如何才能获得相同的结果?

用户首先是如何登录的?如果他们从不同的页面登录,您必须将他们重定向到要登录的页面。如果在单页应用程序中执行此操作,则web服务调用需要返回指示会话状态的标志。如果会话过期,ajax调用将触发登录视图。希望能有所帮助。

这里想到的唯一一件事是使用对Web服务的AJAX调用,该调用将检查会话是否处于活动状态,然后采取相应的行动。大致如下(未经测试):

ASHX处理程序:

<%@ WebHandler Language="C#" Class="CheckSessionAlive" %>
using System;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.Web.Script.Serialization;

public class CheckSessionAlive : IHttpHandler, IRequiresSessionState {

    public void ProcessRequest (HttpContext cx) {
        cx.Response.ContentType = "text/json";
        cx.Response.Write(new JavaScriptSerializer().Serialize(new
        {
            Result = cx.Session["SomeRandomValue"] != null ? 1 : -1
        }));
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}
function CheckSessionAlive() {
    $.ajax({
        url: "CheckSessionAlive.ashx",
        type: "GET",
        success: function (data) {
            if (data.Result == 1)
                setTimeout(CheckSessionAlive, 5000); // 5 seconds
            else
                window.location.href = "http://www.google.com";
        }
    });
}

$(document).ready(function () {
    CheckSessionAlive();
});

我希望它有用:)。

我能够解决这个问题。这是我的方法

default.aspx的
pageload
中,我从
web.config
文件获取会话时间

protected void Page_Load(object sender, EventArgs e)
{
  Response.Cache.SetCacheability(HttpCacheability.NoCache);
  if (!this.IsPostBack)
  {
    Session["Reset"] = true;
    Configuration config = WebConfigurationManager.OpenWebConfiguration("~/Web.Config");
    SessionStateSection section = (SessionStateSection)config.GetSection("system.web/sessionState");
    int timeout = (int)section.Timeout.TotalMinutes * 1000 * 60;
    ClientScript.RegisterStartupScript(this.GetType(), "SessionAlert", "SessionExpireAlert(" + timeout + ");", true);
  }
}
然后使用
JavaScript函数
进行倒计时,并在达到60秒时显示警告消息

<script type="text/javascript">
function SessionExpireAlert(timeout) {
var seconds = timeout / 1000;
document.getElementsByName("secondsIdle").innerHTML = seconds;
setInterval(function () {
    seconds--;
    document.getElementById("secondsIdle").innerHTML = seconds;
}, 1000);
setTimeout(function () {
    //Show Popup before 20 seconds of timeout.
     toastr.info('You will be logged out in: <span id="secondsIdle">' '</span> seconds.<br/>Click here to stay logged in.', "Warning",
        { timeOut: 0, 'position-class': 'toast-tontainer',onclick: renewSessionState}
}, timeout - 20 * 1000);
setTimeout(function () {
    window.location = "logout.aspx";
}, timeout);
};
</script>  


function renewSessionState() {
$.ajax({
    url: "/Handlers/Ping.ashx",
    method: 'POST'
});
}

函数SessionExpireAlert(超时){
var秒=超时/1000;
document.getElementsByName(“secondsIdle”).innerHTML=seconds;
setInterval(函数(){
秒--;
document.getElementById(“secondsIdle”).innerHTML=seconds;
}, 1000);
setTimeout(函数(){
//在超时20秒前显示弹出窗口。
toastr.info('您将在:''秒后注销。
单击此处以保持登录状态。,“警告”, {超时:0,'position class':'toast tontainer',onclick:renewSessionState} },超时-20*1000); setTimeout(函数(){ window.location=“logout.aspx”; },超时); }; 函数renewSessionState(){ $.ajax({ url:“/Handlers/Ping.ashx”, 方法:“发布” }); }

注意*
Ping.ashx
只是一个空的处理程序。

用户使用
login.aspx
页面登录。一旦用户成功登录,我设置会话变量并将用户重定向到
default.aspx
但是,在重定向之后,默认页面中发生的所有事情都没有回发。感谢您的回复。会话长度在我的应用程序的webconfig文件中设置。webservices如何知道会话是否过期?您是wecome:)。AJAX调用将每隔5秒调用一次webservice,它将检查您可以在登录序列中使用伪值设置的会话值(如果您使用的是asp:login,则可以在OnLoggedIn事件中进行设置)。在我的示例中,一旦会话本身过期,检查将返回一个空值,使webservice返回-1,AJAX函数将重定向到google.com。这是一个很好的选择,如果您能将我的建议标记为一个答案,那就太好了,因为我认为它很有帮助-但是我看到了一个小警告:如果出于某种原因,您的web.config文件中有slidingExpiration=true,那么超时将不会同步。此外,您还依赖于浏览器的计时器,可以使用简单的控制台javascript函数或greasemonkey脚本更改超时。服务器端方式更安全,IMHO:P