私は次のようなカスタムメンバーシッププロバイダーを持っています:
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
メソッドを呼び出すにはどうすればよいですか?