小编aho*_*mes的帖子

从Global.asax.cs调用时,Identity Framework种子方法不保存新创建的用户

我正在尝试在应用程序启动期间在Identity框架中播种"admin"帐户.我们的大部分应用程序都没有通过代码优先的Entity框架模型进行设置,因此我需要在不扩展其中一个IDatabaseInitializer类的情况下执行此操作.我使用与这些数据库优先模型相同的数据库.

这是一个ASP.NET MVC 5应用程序.

Global.asax.cs,我有以下相关代码.

using (var context = new IdentityContext(EnvironmentSettings.Current.DatabaseConnections.CreateDbConnection("Extranet").ConnectionString))
{
    context.SeedAdminAccount(EnvironmentSettings.DefaultAdminAccount.UserName, EnvironmentSettings.DefaultAdminAccount.Password).Wait();
}
Run Code Online (Sandbox Code Playgroud)

连接字符串是Azure SQL服务器.用户名是电子邮件地址,密码是一串字符,包括一声巨响.

IdentityContext类看起来像这样.

public class IdentityContext : IdentityDbContext<IdentityUser>
{
    public IdentityContext(string connectionString) : base(connectionString)
    {
        Debug.WriteLine(connectionString);
        Initialize();
    }

    void Initialize()
    {
        Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
        Database.SetInitializer<IdentityContext>(new CreateInitializer());
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<IdentityUser>().ToTable("IdentityUser", "dbo");
        modelBuilder.Entity<IdentityRole>().ToTable("IdentityRole", "dbo");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("IdentityUserClaim", "dbo");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("IdentityUserLogin", "dbo");
        modelBuilder.Entity<IdentityUserRole>().ToTable("IdentityUserRole", "dbo");
    }
}
Run Code Online (Sandbox Code Playgroud)

context.SeedAdminAccount()是...的延伸IdentityContext.看起来像这样.

public static class IdentityContextExtensions
{
    public static async Task SeedAdminAccount(this …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc asp.net-identity

5
推荐指数
1
解决办法
4928
查看次数

在ASP.NET的上下文中,为什么不调用异步方法时Task.Run(...).结果死锁?

我用一个控制器和一个方法创建了一个简单的WebApi项目:

public static class DoIt
{
    public static async Task<string> GetStrAsync(Uri uri)
    {
        using (var client = new HttpClient())
        {
            var str = await client.GetStringAsync(uri);
            return str;
        }
    }
}

public class TaskRunResultController : ApiController
{
    public string Get()
    {
        var task = Task.Run(() =>
            DoIt.GetStrAsync(new Uri("http://google.com"))
        );
        var result = task.Result;

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

我非常了解async/await和tasks; 斯蒂芬克莱里几乎虔诚地跟随他.只是存在.Result让我焦虑,我希望这会陷入僵局.我知道这Task.Run(...)很浪费,导致在等待异步DoIt()完成时占用一个线程.

问题是这不是死锁,而是让我心悸.

我看到一些答案,如/sf/answers/2282496401/,我也观察到SynchronizationContext.Currentlambda执行时为null.但是,我也有类似的问题,问为什么上面的代码会出现死锁,而且我发现死锁ConfigureAwait(false)是在使用(不捕获上下文)的情况下发生的.Result.

是什么赋予了?

c# asp.net asynchronous task synchronizationcontext

5
推荐指数
1
解决办法
1064
查看次数