2017-10-08 106 views
0

在生成JWT令牌时,我遇到了一个持续性问题,大约有30%的情况。UserManager asp.net Core 2.0:连接未关闭。 '正在连接'

原来的设置是使用依赖注入,但对错误的发现,我的UserManager实例在下面的代码“新鲜”:

[AllowAnonymous] 
[Route("token")] 
public async Task<BaseResult> Token(string email, string password) 
{ 
    if (email == null) return new BaseResult(BaseResult.ResultCodes.InvalidInput, "not a user"); 
    //var user = await UserManager.FindByNameAsync(email); 
    using (UserManager<User> usermanager = new UserManager<User>(new UserStore<User>(new UserContext()), null, 
     new PasswordHasher<User>(), null, null, null, null, null, null)) 
    { 
     User user = await usermanager.FindByEmailAsync(email); 
     if (user == null) 
      return new BaseResult(BaseResult.ResultCodes.NotFound, "user not found"); 

     if (usermanager.PasswordHasher.VerifyHashedPassword(user, user.PasswordHash, password) != 
      PasswordVerificationResult.Success) 
      return new BaseResult(BaseResult.ResultCodes.InvalidInput, "password incorrect"); 

     var token = await GetJwtSecurityToken(user); 

     return new TokenResult(new JwtSecurityTokenHandler().WriteToken(token), token.ValidTo); 
    } 
//{ 
    // token = new JwtSecurityTokenHandler().WriteToken(token), 
    // expiration = token.ValidTo 
    //}); 
} 

异常大干快上usermanager.FindByEmailAsync(电子邮件)的30%抛出案例和内容如下:

System.InvalidOperationException:'连接未关闭。连接的当前状态正在连接。“

由于在上面的行中创建了上下文,所以这个错误我不明白。考虑到SQL服务器没有完全从先前的请求中完成,尽管它在新开始时经常发生。

信息目的:我的背景:

public sealed class UserContext:IdentityDbContext<User> 
{ 
    public UserContext() 
    { 
     Database.EnsureCreatedAsync(); 
    } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     optionsBuilder 
      .UseSqlServer($"Server =PC; Database =PFUsers; Trusted_Connection = True;MultipleActiveResultSets=true;"); 



     base.OnConfiguring(optionsBuilder); 
    } 
} 

虽然进行调试规避,但使用DI时,相关启动部是:

services.AddEntityFrameworkSqlServer() 
    .AddDbContext<UserContext>(ServiceLifetime.Scoped); 



services.AddIdentity<User, IdentityRole>() 
    .AddEntityFrameworkStores<UserContext>(); 

回答

0

删除给这个MultipleActiveResultSets = TRUE;从连接字符串解决它。

对于令牌请求MARS会适得其反(对于单个请求的开销)