我正在使用 C# MVC 开发 Web 应用程序并使用 Session 在多个请求之间保留数据。
有时 session 超时,所以我想办法让它保持事件状态,并在 stackoverflow 中找到了一些解决方案。由于不愿意简单地将代码复制粘贴到我的项目中,我试图重写代码以满足我的需要并更好地理解它。
起初我尝试使用以下代码使 session 保持事件状态:
JS + jQuery - 客户端:
function keepAliveFunc(){
setTimeout("keepAlive()", 300000);
};
function keepAlive() {
$.get("/Account/KeepAlive", null, function () { keepAliveFunc(); });
};
$(keepAliveFunc());
C# - 服务器端:
[HttpGet]
public bool KeepAlive()
{
return true;
}
但这似乎并没有让我的 session 保持事件状态,它正常过期。 经过一段时间的摆弄后,我将代码更改为:
JS + jQuery - 客户端:
function keepAliveFunc(){
setTimeout("keepAlive()", 10000);
};
function keepAlive() {
$.post("/Account/KeepAlive", null, function () { keepAliveFunc(); });
};
$(keepAliveFunc());
C# - 服务器端:
[HttpPost]
public JsonResult KeepAlive()
{
return new JsonResult { Data = "Success" };
}
后者运行良好,这让我得出结论,虽然有些不确定,但由于 POST 请求而不是 GET 请求, session 保持事件状态。这就提出了一个问题:为什么我需要在试图让我的 Session 保持事件状态时使用 POST?有什么不同?我是否犯了其他我不理解的错误?
我一直在寻找答案,但我似乎找不到关于这个问题的任何答案,只是没有太多解释的解决方案。阅读 MSDN 上的 Session 也对我帮助不大。这让我得出结论,有一些与 Session 相关的“词”和这个我还没有遇到的特殊问题,这使我无法有效地谷歌搜索。
最佳答案
无论是 GET 还是 POST,浏览器都会随请求发送 SessionId cookie。因此,出于保持事件的目的,使用哪一个都无关紧要。由于您和“ping”服务器的时间间隔不同,您很可能会看到行为上的差异。
对于 GET 请求,您以 300000 毫秒的间隔执行,而对于 POST 请求,您以 10000 毫秒的间隔执行。
很可能,您的服务器的 session 生命周期介于这两个值之间。 但是,您可以配置 session 生命周期以满足您的需要(如增加它),但请记住,过期 session 是一项安全功能,因此请尝试找到一个足够大的小值让您的应用程序正常工作,但是仍然允许 session 在安全的时间间隔内过期。
关于c# - 为什么要使用 post 来保持 session 存活?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35430918/