【发布时间】:2015-09-15 12:12:51
【问题描述】:
我的问题有点奇怪,我只在生产服务器上遇到过。基本上,我在第二次 ajax 调用中丢失了会话值。整个过程就像用户点击一个按钮启动同步过程,其中涉及两次 ajax 命中,第一次是 post 请求,成功完成后是第二次 get 请求。
我的代码如下:
jQuery 代码:
//User clicks "SyncButton" to initiate sync process
$('#SyncButton').on('click', function (event) {
//Some UI Code
$.ajax({
type: 'POST',
beforeSend: startService, //startService has some UI code
url: "FirstAjaxURL",
data: null,
contentType: "application/json",
success: function (data) {
ServiceSuccess(data);
},
error: serviceError
});
});
function ServiceSuccess(data) {
var html = ''; //code to get html from data
$('#divSync').html(html);
if (!($('#delete').length > 0)) {
RenderBusinessGrid();
}
};
function RenderBusinessGrid() {
var allBusiness = "";
$.getJSON("SecondAjaxURL", function (data) {
//Some UI handling code
});
$('#divSyncDetails').height('400px');
}
MVC 代码:
[HttpPost]
public string FirstAjaxURL()
{
//make some DB hits
//fetch data
//create couple of zip files
2015 年 7 月 6 日编辑
//Unzip a zip file in one of the sub-directories. This zip file contains multiple sub-directories and files.
2015 年 7 月 6 日编辑
//save them in two separate folders in separate folders under root directory
/*LOGS SUGGEST ALL SESSION KEYS WERE AVAILABLE HERE*/
return "some string result";
}
public ActionResult SecondAjaxURL()
{
/*LOGS SUGGEST SESSION KEYS NOT AVAILABLE HERE*/
//do some DB operation
return jsonResult;
}
到目前为止我所做的一切:
- 检查了应用程序池回收时间的 IIS 设置,它们似乎没问题
- 会话超时设置为较大的值,如果我让系统空闲,它不会超时
- 确认第一次 ajax 命中没有未处理的异常
- 尝试将 zip 文件保存在应用程序的目录结构之外
- 尝试用 $.ajax 替换 $.getJson(我知道尝试这样做很愚蠢,但你永远不知道...... :)
注意:在大多数情况下,第二个 ajax 调用的会话超时是在用户第一次启动同步过程时。虽然我们观察到相当多的情况会发生第二次或第三次。
更多细节: 我检查了事件日志,发现每次注销时都会在事件查看器中记录以下错误:
事件代码:4005 事件消息:请求的表单身份验证失败。原因:提供的票证无效。
请建议我还可以尝试/验证什么来找出这个问题的根本原因,这让我很困扰。欢迎大家指点。
谢谢, 拉维
【问题讨论】:
-
您的应用程序是否托管在多台服务器上,并带有负载均衡器?
-
你在 web.config 中设置了
<sessionState>吗? -
@nikhil:不,它是没有负载平衡器或其他东西的专用服务器。它只是一个简单的基于 MVC 的 SPA。
-
@squiroid:是的,我们有,它的
-
我看不到您在哪里创建会话?尝试在 Ajax 调用之前读取 JQuery 中的会话并查看会话是否仍处于活动状态。或者甚至将会话删除添加到 Global.asax 并查看它何时调用会话删除或超时。除了startService,代码中似乎没有任何问题。您是否设置了一些应用程序池内存限制?如果它 reCycle 则删除会话
标签: jquery ajax asp.net-mvc session