0

私は次のようなカスタムメンバーシッププロバイダーを持っています:

public class PMembershipProvider : MembershipProvider
{
    public IMembershipService Account { get; set; }

    public PMembershipProvider()
    {
        this.Account = new UserModel();

    }

    public override bool ValidateUser(string username, string password)
    {
        return Account.Login(username, password);
    }

    public void DisposeContext()
    {
        Account.Dispose();
    }
}

そして、次のようなメンバーシップサービスインターフェイス:

public interface IMembershipService
{
    bool Login(string userName, string password);
    void Dispose();
}

したがって、ユーザーにログインするときに、次のようにユーザーモデルのログインメソッドを呼び出すことができます。

public class UserController : Controller
{
    public ActionResult Login(UserModel model)
    {
        if (Membership.ValidateUser(model.name, model.password)) {
            FormsAuthentication.SetAuthCookie(model.name, false, MvcApplication.BASE_URL);
            return RedirectToAction("Index", "Home");
    }
}

処理されていないEFオブジェクトコンテキストに関連していると思われる奇妙なユーザーの問題が発生しています。この回答に基づいて、メンバーシッププロバイダーが使用するオブジェクトコンテキストを手動で破棄してみます。リクエストの最後にこれを実行したいので、そのためにDisposeユーザーコントローラーのメソッドをオーバーライドします。

protected override void Dispose(bool disposing)
{
    base.Dispose(disposing);
    Membership.DisposeContext(); //this is what I want to do, but it doesn't work
}

カスタムメンバーシッププロバイダーのメソッドを呼び出そうとすると、DisposeContextメソッドが見つかりません。(「System.Web.Security.Membership」には「DisposeContext」の定義が含まれていません)

Membershipで使用されているのと同じオブジェクトでDisposeContextメソッドを呼び出すにはどうすればよいですか?

4

1 に答える 1

2

このMembershipクラスは、既定のメンバーシップ プロバイダーで既知のメソッドを呼び出すための静的メソッドのみを提供します。Membership.Providerカスタム メソッドを呼び出すには、プロパティにアクセスし、それをカスタム プロバイダーにキャストしてから、メソッドを呼び出す必要があります。

((PMembershipProvider)Membership.Provider).DisposeContext();
于 2012-12-04T19:06:30.357 に答える