MVC 5 登录挂起,需要重新启动 VS 2015



所以我有一个基本的MVC5解决方案,我已经实现了身份2来授权登录。 我在家用计算机(Windows 10(上开发它,没有任何问题,尽管今晚我将通过一些严格的测试来运行它,但是我刚刚将解决方案从TFS拉到我的工作PC(Windows 7(上,并发现了登录过程的问题。

基本上,登录工作正常,注销也是如此,但在某些时候它会挂起,永远加载。 修复的唯一方法是关闭浏览器窗口,停止调试并重新启动VS 2015。

这是我的登录控制器:

        // GET: Login
    [AllowAnonymous]
    public ActionResult Index(string returnUrl)
    {
        return View();
    }
    // POST: Login
    [HttpPost, AllowAnonymous, ValidateAntiForgeryToken]
    public ActionResult Index(LoginViewModel lvm, string returnUrl)
    {
        if (!ModelState.IsValid) return View(lvm);
        var up =  new UserProvider();
        var identity = up.FindAccount(lvm);
        if (identity == null) return View(lvm);
        Authentication.SignIn(new AuthenticationProperties
        {
            IsPersistent = lvm.RememberMe
        }, identity);
        if (IsValidReturnUrl(returnUrl))
        {
            return Redirect(returnUrl);
        }
        return RedirectToAction("Index", "Home");
    } 
        // GET/POST: Logout
    public ActionResult Logout()
    {
        Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
        return RedirectToAction("Index", "Home");
    }
    public bool IsValidReturnUrl(string returnUrl)
    {
        return !string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl);
    }

方法 FindAccount(( 使用 LoginViewModel 中提供的信息来访问数据库。 现在,有两个用户表,"卖家"和"客户"。 这些是具有单独表的独立实体,尽管此时它们的数据库结构是相同的,但最终它们不会相同。

public class UserProvider
{

    public ClaimsIdentity FindAccount(LoginViewModel login)
    {
        var _db = new AppDbContext();
        var user = login.Login;
        var password = login.Password;
        if (IsAccountNumber(user))
        {
            int accountNo;
            int.TryParse(user, out accountNo);
            var seller = _db.Sellers.SingleOrDefault(s => s.SellerNo.Equals(accountNo)
                                                   && s.Password.Equals(password));
            if (seller != null)
            {
                return BuildIdentity(seller.Email, seller.FirstName, seller.SellerNo.ToString(), "Seller");
            }
            var cust = _db.Customers.SingleOrDefault(c => c.CustomerNo.Equals(accountNo) && c.Password.Equals(password));
            if (cust != null)
            {
                return BuildIdentity(cust.Email, cust.FirstName, cust.CustomerNo.ToString(), "Customer");
            }
        }
        else
        {
            var seller = _db.Sellers.SingleOrDefault(s => s.Email.Equals(user)
                                                   && s.Password.Equals(password));
            if (seller != null)
            {
                return BuildIdentity(seller.Email, seller.FirstName, seller.SellerNo.ToString(), "Seller");
            }
            var cust = _db.Customers.SingleOrDefault(c => c.Email.Equals(user) && c.Password.Equals(password));
            if (cust != null)
            {
                return BuildIdentity(cust.Email, cust.FirstName, cust.CustomerNo.ToString(), "Customer");
            }
        }
        return null;
    }
    public bool IsAccountNumber(string login)
    {
        int accountNo;
        return int.TryParse(login, out accountNo);
    }
    public ClaimsIdentity BuildIdentity(string email, string firstName, string role, string accountNo)
    {
        var identity = new ClaimsIdentity(new[]
                {
                    new Claim(ClaimTypes.Name, email),
                    new Claim("FirstName", firstName),
                    new Claim("AccountNumber", accountNo),
                    new Claim(ClaimTypes.Role, role) 
                },
                DefaultAuthenticationTypes.ApplicationCookie,
                ClaimTypes.Name, ClaimTypes.Role);
        return identity;
    }
}
登录

还允许用户输入其帐号或电子邮件地址进行登录。 正如您在上面的代码中看到的,它首先检查详细日志是否是帐号,如果是,则检查数据库中匹配的帐户/密码组合。 然后,它会执行相同的操作,但对于未提供帐号的电子邮件。

现在这工作正常,但是当它开始挂起时,4-10 次登录/注销之间的任何地方。我们还发现(我的同事在他的工作机器上遇到了同样的问题,也是Windows 7,VS 2015(,如果您输入正确的信息,这似乎会使死锁/挂起更快地发生。

我在提交中使用了一个断点并跟踪堆栈以查找它发生的位置,它似乎在数据库的 Linq 查询中,它将在 VS 中挂起,然后当它最终解析时,我按 F10 单步执行,它立即存在断点调试模式,继续应用程序(现在处于挂起状态(。

我已经尝试了无数的事情,重建解决方案,重建数据库,更改本地主机端口,调整重定向。 对我来说,死锁的"累积"性质似乎表明内存泄漏正在逐渐填满 IIS 服务器,但我一生都无法弄清楚在哪里。

需要注意的一件事是,一旦我关闭浏览器并告诉它停止调试,我就会收到一条关于 iisexpress 和 func-evals 的消息,我需要终止它们才能分离。

谢谢。

已解决,事实证明,在我从家用计算机上传到 TFS 的过程中,某些内容已损坏,因此 TFS 上的版本有问题。 以前从未发生过这种情况!

最新更新