繁体   English   中英

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

[英]MVC 5 Login hanging, requires restart of VS 2015

因此,我有一个基本的MVC5解决方案,我已经实现了Identity 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来跳过并且它立即存在断点调试模式,继续应用程序(现在处于挂起状态)。

我尝试了许多事情,重建解决方案,重建数据库,更改localhost端口,调整重定向。 僵局的“累积性”性质似乎表明内存泄漏正在逐渐填满IIS服务器,但是我无法终生弄清楚错误的位置。

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

谢谢。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM