这里我的问题有点奇怪,我只在生产服务器上遇到它。基本上我在第二次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;
}
到目前为止我所做的一切:
注意:在大多数情况下,第二次ajax上的会话超时会在用户首次启动同步过程时调用。虽然我们观察到很多情况,这种情况发生在第二次或第三次。
一些进一步的细节: 我检查了事件日志,发现每次注销时都会在事件查看器中记录错误:
事件代码:4005 事件消息:请求的表单身份验证失败。原因:提供的故障单无效。
请建议我还有什么可以尝试/验证来解决这个问题的根本原因,这让我很烦恼。欢迎所有指针。
谢谢, 拉维
答案 0 :(得分:1)
几年前我遇到过类似的问题。 我遇到的问题类似于What could cause an asp.net application to forget a user?。
关键在于作者自己的答案: 问题似乎是应用程序池正在回收,并且身份验证cookie变得无效,因为在机器密钥已更改时无法再读取它。解决方案是将machineKey段添加到web.config并提供静态机器密钥。
答案 1 :(得分:0)
我的问题简述:在第一个ajax中执行了一些操作,其中包括添加/更新多个文件/文件夹和第二个ajax命中,一旦由于会话变量不可用而首次到达客户端失败的结果就会启动。
根本原因:文件更改通知(FCN)行为
解决方案:在我的情况下,我最终移动了culprit文件夹,其中所有文件/文件夹更改都发生在Web应用程序之外。由于我需要从Web应用程序直接访问此文件夹的文件,因此我最终将此文件夹作为虚拟目录。
所以以前就像这样
现在它看起来像我的实际资产文件夹位于我的webapp之外,它有自己的虚拟目录和单独的应用程序池,可以搞乱:)
注意:我尝试使用FCNMode web.config设置,这似乎对.NET 4.5上的某些用户有用,但不幸的是它对我没用。如果您遇到类似问题,我建议您先尝试该设置。