我正在使用C#MVC开发一个Web应用程序,并使用Session在多个请求之间保留数据。
有时会话超时,所以我找了办法保持活着,并在stackoverflow中找到了一些解决方案。我不愿意简单地将代码复制粘贴到我的项目中,而是试图重写代码以满足我的需求并更好地理解它。
首先,我尝试使用以下代码保持会话处于活动状态:
JS + jQuery - 客户端:
function keepAliveFunc(){
setTimeout("keepAlive()", 300000);
};
function keepAlive() {
$.get("/Account/KeepAlive", null, function () { keepAliveFunc(); });
};
$(keepAliveFunc());
C# - 服务器端:
[HttpGet]
public bool KeepAlive()
{
return true;
}
然而,这似乎没有使我的会话保持活跃,它正常到期。 经过一段时间的摆弄,我将代码更改为:
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的活动时需要使用POST?有什么不同?我是否犯了其他一些我不理解的错误?
我已经找到了答案,但我似乎无法在这个问题上找到任何答案,只是没有太多解释的解决方案。阅读MSDN上的Session也对我没什么帮助。这让我得出结论,有一些与Session相关的“单词”和我尚未遇到的这个问题,这使我无法有效地进行谷歌。
答案 0 :(得分:4)
使用GET或POST,浏览器会发送带有请求的SessionId cookie。因此,为了保持活力,使用哪一个并不重要。很可能你会看到行为上的差异,因为你和服务器“ping”的间隔不同。
使用GET请求时,您以300000毫秒的间隔执行此操作,而使用POST请求则以10000毫秒的间隔执行此操作。
最有可能的是,服务器的会话生命周期介于两个值之间。 但是,您可以配置会话生命周期以满足您的需求(如增加它),但请记住,到期会话是一个安全功能,因此请尝试找到一个足够大的小值,以使您的应用程序正常工作,但仍允许会话在安全的时间间隔内到期。