当前位置:  开发笔记 > 编程语言 > 正文

两个同时发生的Ajax请求导致同一操作错误

如何解决《两个同时发生的Ajax请求导致同一操作错误》经验,为你挑选了1个好方法。

我有以下行动

public async Task Cart(bool refresh = false, bool mobile = false)
{

   var user = await Auth.GetUserAsync();
   //rest of the code

}

由2个ajax调用同时调用两次(一个用于呈现移动局部,其他正常页面).

$(document).ready(function () {
   $("basket").html('');
   $('basket').load(PartialURL + "/Cart");
   $('MobileBasket').load(PartialURL + "/Cart?mobile=true");

});

真正的问题出现在Auth.GetUserAsync()功能上.

码:

  public static async Task GetUserAsync()
    {

            if (HttpContext.Current == null || HttpContext.Current.Request == null
                || HttpContext.Current.User == null || HttpContext.Current.Request.IsAuthenticated == false)
                return null;


            //if session does not exist, but user is logged in, fill session information
            if (HttpContext.Current.Session[sessionKey] == null && HttpContext.Current.Request.IsAuthenticated)
                using (var dal = new DAL.DAL())
                {
                    //load user from DB
                    var user = await dal.SingleOrDefaultAsync(m => m.Email == HttpContext.Current.User.Identity.Name);
                    HttpContext.Current.Session[sessionKey] = user;
                }


            return HttpContext.Current.Session[sessionKey] as User;


    }

在其中一个调用中,函数正常返回用户,但其他调用产生以下错误(来自fiddler的屏幕截图).注意第一次通话是如何成功的.

错误 - 提琴手

SingleOrDefaultAsync的代码如下:

 public  Task SingleOrDefaultAsync(Expression> predicate) where T : class
    {
        return  _context.Set().SingleOrDefaultAsync(predicate);
    }

我在调试时检查过,并且两个请求中都有电子邮件,_context不为null,并且存在请求的电子邮件的用户,但其中一个始终返回错误.错误随机返回.有时在第一次,有时在第二次ajax呼叫.

有人可以告诉我是什么原因造成这个错误?任何帮助是极大的赞赏.



1> Gary McGill..:

我认为,由于你已经进行了其他检查,那个HttpContext.Current.User.Identity.Name(甚至HttpContext.Current.User.Identity)是空的,那就是造成错误的原因.

如果第一个请求导致身份验证过程启动,但该过程尚未完成,则可能是这样- 因此空检查您已成功,但后续成员访问失败.换句话说,您有计时问题/竞争条件.但这只是猜测.

更新:根据我的建议将名称存储在变量中并使用lambda中的变量,一切正常.但为什么?

我的理论是传递给你的SingleOrDefaultAsync方法的表达式 包括表达式HttpContext.User.Identity.Name,而不是表达式.

然后在您的DAL中评估此表达式,其中HttpContext.Current(推测)null(假设您的DAL不在您的Web项目中).QED?

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有