5

vNext を理解しようとしています。
MongoDB で動作し、これらのインターフェイスを実装するカスタム UserStore を作成しました。

  public class UserStore : IUserStore<ApplicationUser>, IUserPasswordStore<ApplicationUser>, IUserSecurityStampStore<ApplicationUser>,
    IUserLoginStore<ApplicationUser>, IUserClaimStore<ApplicationUser>, IUserEmailStore<ApplicationUser>, IUserRoleStore<ApplicationUser>,
    IUserTwoFactorStore<ApplicationUser>

Startup.cs に以下が追加されました。

app.UseServices(services =>
        {

            services.AddIdentity<ApplicationUser>()
                .AddUserStore(() => { return new UserStore(); })
                .AddUserManager<UserManager<ApplicationUser>>()
                .AddHttpSignIn();

            services.AddMvc();
        });

次に、Visual Studio テンプレートから変更されていない AccountController を使用しようとしましたが、問題が発生しました。
サインインすると、UserStore.FindByNameAsync() で ObjectDisposedException を取得します - UserStore.Dispose() と呼ばれるもの。
github.com/aspnet Store.Dispose() の UserManager コードでは、UserManager.Dispose() でのみ呼び出されます。
Dispose の呼び出しを無視するだけですべて正常に動作しますが、これは良い方法ではありません。
だから私は何をすべきか分かりません

PS 質問は: UserStore.Dispose() を呼び出すことができるもの (およびその理由) は何ですか?

4

1 に答える 1

1

vNext では、DI が組み込まれており、ID サービスの有効期間を管理します。おそらく、サービスが破棄された後に ID を使用しようとしていると思われます。デフォルトでは、ID サービスの有効期間はリクエストに限定されているため、たとえば、ユーザー マネージャーへの参照を保持し、それを複数のリクエストで再利用しようとしているとします。 ObjectDisposedException が発生します。

于 2014-09-03T21:11:33.533 に答える