簡體   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