Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC 5页在db调用时挂起_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# ASP.NET MVC 5页在db调用时挂起

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

我正在尝试使用ASP.NET Identity 2.0启动并运行一个MVC 5项目。我的出发点是中的示例应用程序。我的第一页是主页/索引。当我尝试进行搜索(期望返回空值)时,应用程序只是挂起,我不知道为什么。db上下文的实例化导致调用Seed()方法,这似乎很正常,但它挂起在roleManager.FindByName(roleName)调用上(我在下面的代码中对其进行了注释)。暂停调试器显示了它被卡住的地方,但我不知道从哪里开始。相关课程如下

控制器:

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);
}
}
}

我也有同样的问题,我就是这样解决的

  • 删除当前数据库(我使用的是.mdf)
  • 创建新数据库
  • 清理和重建
  • 更新数据库-如果需要-
  • 不幸的是,我不知道问题的根源。如果您知道,请编辑答案/发表评论:)

    对于存在相同问题的其他人,请确保ApplicationBinInitializer中的用户名/密码有效。例如,如果您将管理员密码设置为123,它将挂起

    编辑:这篇文章提供了一个解释+答案

    错误是因为您正在控制器中实例化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未引用的数据层。我想在数据层中使用用户管理器,但没有可访问的文本,即使