2017-10-08 7 views
0

JWTトークンを生成する際に、約30%の問題が発生することがあります。UserManager asp.netコア2.0:接続が閉じられませんでした。 'Connecting'

元のセットアップは、依存性注入を使用しているが、エラーの発見のために、私は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 Serverを検討してください。ただし、新しく起動すると頻繁に発生します。

情報の目的:私のコンテキスト:

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 =を削除します。接続文字列からそれを解決しました。

トークンリクエストの場合、MARSは非生産的です(単一リクエストのオーバーヘッド)

関連する問題