【问题标题】:session cleared on second ajax call在第二个 ajax 调用上清除会话
【发布时间】: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;
}

到目前为止我所做的一切:

  1. 检查了应用程序池回收时间的 IIS 设置,它们似乎没问题
  2. 会话超时设置为较大的值,如果我让系统空闲,它不会超时
  3. 确认第一次 ajax 命中没有未处理的异常
  4. 尝试将 zip 文件保存在应用程序的目录结构之外
  5. 尝试用 $.ajax 替换 $.getJson(我知道尝试这样做很愚蠢,但你永远不知道...... :)

注意:在大多数情况下,第二个 ajax 调用的会话超时是在用户第一次启动同步过程时。虽然我们观察到相当多的情况会发生第二次或第三次。

更多细节: 我检查了事件日志,发现每次注销时都会在事件查看器中记录以下错误:

事件代码:4005 事件消息:请求的表单身份验证失败。原因:提供的票证无效。

请建议我还可以尝试/验证什么来找出这个问题的根本原因,这让我很困扰。欢迎大家指点。

谢谢, 拉维

【问题讨论】:

  • 您的应用程序是否托管在多台服务器上,并带有负载均衡器?
  • 你在 web.config 中设置了<sessionState> 吗?
  • @nikhil:不,它是没有负载平衡器或其他东西的专用服务器。它只是一个简单的基于 MVC 的 SPA。
  • @squiroid:是的,我们有,它的
  • 我看不到您在哪里创建会话?尝试在 Ajax 调用之前读取 JQuery 中的会话并查看会话是否仍处于活动状态。或者甚至将会话删除添加到 Global.asax 并查看它何时调用会话删除或超时。除了startService,代码中似乎没有任何问题。您是否设置了一些应用程序池内存限制?如果它 reCycle 则删除会话

标签: jquery ajax asp.net-mvc session


【解决方案1】:

几年前我也遇到过类似的问题。 我遇到的问题类似于What could cause an asp.net application to forget a user?

关键在于作者自己的回答: 问题似乎是应用程序池正在回收,并且身份验证cookie变得无效,因为机器密钥已更改,因此无法再读取它。解决方案是在 web.config 中添加一个 machineKey 段并提供一个静态机器密钥。

【讨论】:

  • 感谢 Eric 的回答,我尝试在我的配置文件中添加机器密钥,但这也没有帮助。我尝试使用 IIS 机器密钥生成器添加机器密钥,也正如以下链接 iis.net/learn/troubleshoot/security-issues/… 中所建议的那样
  • 此外,您的建议似乎是正确的方向,因为在事件查看器中我收到错误消息“事件代码:4005 事件消息:请求的表单身份验证失败。原因:提供的票证无效。”
【解决方案2】:

我的问题简述:在第一个 ajax 中执行了一些操作,包括添加/更新多个文件/文件夹和第二个 ajax 命中,一旦由于会话变量不可用而导致第一次到达客户端失败时启动。

根本原因:文件更改通知 (FCN) 行为

解决方案:在我的情况下,我最终移动了罪魁祸首文件夹,其中所有文件/文件夹更改都发生在 Web 应用程序之外。由于我需要从 Web 应用程序直接访问此文件夹的文件,因此我最终将此文件夹设置为虚拟目录。

原来是这样的

现在它看起来像这样,我的实际资产文件夹位于我的 webapp 之外,有自己的虚拟目录和单独的应用程序池来搞乱:)

注意:我尝试使用 FCNMode web.config 设置,该设置似乎适用于 .NET 4.5 上的某些用户,但不幸的是它对我不起作用。如果您遇到类似问题,我建议您先尝试该设置。

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 2016-06-22
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2015-06-24
    • 2020-10-16
    • 2013-01-09
    • 1970-01-01
    相关资源
    最近更新 更多