C# ASP.NET MVC 5页在db调用时挂起
我正在尝试使用ASP.NET Identity 2.0启动并运行一个MVC 5项目。我的出发点是中的示例应用程序。我的第一页是主页/索引。当我尝试进行搜索(期望返回空值)时,应用程序只是挂起,我不知道为什么。db上下文的实例化导致调用Seed()方法,这似乎很正常,但它挂起在roleManager.FindByName(roleName)调用上(我在下面的代码中对其进行了注释)。暂停调试器显示了它被卡住的地方,但我不知道从哪里开始。相关课程如下 控制器:C# ASP.NET MVC 5页在db调用时挂起,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正在尝试使用ASP.NET Identity 2.0启动并运行一个MVC 5项目。我的出发点是中的示例应用程序。我的第一页是主页/索引。当我尝试进行搜索(期望返回空值)时,应用程序只是挂起,我不知道为什么。db上下文的实例化导致调用Seed()方法,这似乎很正常,但它挂起在roleManager.FindByName(roleName)调用上(我在下面的代码中对其进行了注释)。暂停调试器显示了它被卡住的地方,但我不知道从哪里开始。相关课程如下 控制器: public class HomeCon
public class HomeController : ApplicationController
{
public ActionResult Index()
{
var user = db.Users.Find("dummyVal");
return View();
}
[Authorize]
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
public abstract class ApplicationController : Controller
{
protected ApplicationDbContext db;
public ApplicationController()
{
db = new ApplicationDbContext();
}
}
基本控制器:
public class HomeController : ApplicationController
{
public ActionResult Index()
{
var user = db.Users.Find("dummyVal");
return View();
}
[Authorize]
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
public abstract class ApplicationController : Controller
{
protected ApplicationDbContext db;
public ApplicationController()
{
db = new ApplicationDbContext();
}
}
DB初始值设定项:
public class ApplicationDbInitializer : DropCreateDatabaseAlways<ApplicationDbContext>
{
protected override void Seed(ApplicationDbContext context) {
InitializeIdentityForEF(context);
base.Seed(context);
}
//Create User=Admin@Admin.com with password=Admin@123456 in the Admin role
public static void InitializeIdentityForEF(ApplicationDbContext db) {
var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
const string name = "admin@example.com";
const string password = "Admin@123456";
const string roleName = "Admin";
//Create Role Admin if it does not exist
// EXECUTION HANGS ON THIS CALL...
var role = roleManager.FindByName(roleName);
if (role == null) {
role = new IdentityRole(roleName);
var roleresult = roleManager.Create(role);
}
var user = userManager.FindByName(name);
if (user == null) {
user = new ApplicationUser { UserName = name, Email = name };
var result = userManager.Create(user, password);
result = userManager.SetLockoutEnabled(user.Id, false);
}
// Add user admin to Role Admin if not already added
var rolesForUser = userManager.GetRoles(user.Id);
if (!rolesForUser.Contains(role.Name)) {
var result = userManager.AddToRole(user.Id, role.Name);
}
// Create dummy user
const string dummyUserName = "PeterVenkman";
const string dummyUserPwd = "gf%^^ftf83X";
var dummyUser = userManager.FindByName(dummyUserName);
if (dummyUser == null) {
dummyUser = new ApplicationUser { UserName = dummyUserName, Email = dummyUserName };
var result = userManager.Create(dummyUser, dummyUserPwd);
result = userManager.SetLockoutEnabled(dummyUser.Id, false);
}
}
}
公共类应用程序BinInitializer:DropCreateDatabaseAlways
{
受保护的重写无效种子(ApplicationDbContext上下文){
InitializeIdentityFore(上下文);
种子(上下文);
}
//创建用户=Admin@Admin.com带密码=Admin@123456在管理员角色中
公共静态void initializedEntityForef(ApplicationDbContext数据库){
var userManager=HttpContext.Current.GetOwinContext().GetUserManager();
var rolemager=HttpContext.Current.GetOwinContext().Get();
常量字符串名称=”admin@example.com";
常量字符串密码=”Admin@123456";
常量字符串roleName=“Admin”;
//如果角色Admin不存在,则创建该角色
//执行挂起此调用。。。
var role=rolemager.FindByName(roleName);
如果(角色==null){
角色=新的识别码(roleName);
var roleresult=rolemanger.Create(角色);
}
var user=userManager.FindByName(名称);
if(user==null){
user=newapplicationuser{UserName=name,Email=name};
var result=userManager.Create(用户,密码);
结果=userManager.SetLockoutEnabled(user.Id,false);
}
//将用户管理员添加到角色管理员(如果尚未添加)
var rolesForUser=userManager.GetRoles(user.Id);
如果(!rolesForUser.Contains(role.Name)){
var result=userManager.AddToRole(user.Id,role.Name);
}
//创建虚拟用户
常量字符串dummyUserName=“彼得文克曼”;
常量字符串dummyUserPwd=“gf%^^ftf83X”;
var dummyUser=userManager.FindByName(dummyUserName);
如果(dummyUser==null){
dummyUser=new ApplicationUser{UserName=dummyUserName,Email=dummyUserName};
var result=userManager.Create(dummyUser,dummyUserPwd);
结果=userManager.SetLockoutEnabled(dummyUser.Id,false);
}
}
}
我也有同样的问题,我就是这样解决的
错误是因为您正在控制器中实例化dbContext对象,而不是从owin上下文中获取它。两个不同的上下文对象(一个在控制器中,另一个在启动时)在同一个db上工作,导致了此死锁。解决此问题的最简单方法是替换代码
db = new ApplicationDbContext();
与
db=System.Web.HttpContext.Current.GetOwinContext().Get();
解决了这个问题苏哈斯·乔希给出了正确的答案。ApplicationDbContext对象本质上应该是一个由“Microsoft ASPNET Identity Owin”包(使用NuGet安装)管理的单例。当您在ApplicationController中手动创建它的新实例时,对相同资源的争用会导致此死锁 请注意,使用的“Get()”扩展来自以下库,您必须在ApplicationContext类中引用该库
using Microsoft.AspNet.Identity.Owin;
感谢Suhas Joshi指出这一点,因为它大大拯救了我。我本来会投票支持你的答案,但不幸的是,我的声誉还不够好:)。你确定你的应用程序有DB吗?可能无法建立Db连接,并且您的应用程序将挂起,同时将引发timeoutexception。检查您的数据库是否存在,连接字符串是否正确,以及您在连接中使用的用户是否有权访问该数据库。该数据库确实存在,我可以连接到它。事实上,如果我向上下文中添加了一个附加模型,那么在初始化上下文时,表确实会出现在数据库中。Ok。ApplicationRoleManager是否使用标准asp.net成员资格表?(aspnet_角色)如果是,它们是否存在于数据库中?似乎您正在使用asp.net角色管理器,因此您应该为角色管理创建标准表。使用aspnet_regsql.exe工具。aspnet_regsql.exe是一个命令行工具。您可以在不带参数的情况下运行它,让它在向导模式下帮助您,或者应用正确的参数并以突击队的方式进行操作。我相信该工具已经过时,是Identity的当前版本。这些表是由框架中的代码优先定义创建的,它们存在于数据库中。自从发布后,我发现问题源于初始值设定项的DropCreateDatabaseAlways父项。如果我改为使用DropCreateDatabaseIfModelChanges,那么问题就消失了。所以我试图弄清楚这到底是如何工作的。我使用的是存储库模式,我的存储库希望我使用DI来注入上下文,是否有一种推荐的方法来获取IoC容器的上下文并将其提供给IContext供存储库使用?我正在尝试在我的应用程序中构建一个webapi未引用的数据层。我想在数据层中使用用户管理器,但没有可访问的文本,即使