[英]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.