【发布时间】:2014-02-18 11:41:03
【问题描述】:
我在 MVC 4 中遇到自定义成员资格问题 当我执行 ajax 调用以从服务器(控制器)获取部分结果时,我不断收到与上下文生命周期相关的错误,错误始终是 {"The provider has been关闭”} 或 {“已经有一个打开的 DataReader 与此命令关联,必须先关闭。”} 错误总是出现在自定义 RoleProvider 中。 我将尝试解释我正在使用的当前设置。
我继承了 Membership 和 RoleProvier 并重写了所有类似的方法
public class CustomRoleProvider : RoleProvider
{
private IAccountService _accountService;
public CustomRoleProvider()
{
_accountService = new AccountService();
}
public override string[] GetRolesForUser(string username)
{
return _accountService.GetRolesForUser(username);
}
}
Membership 提供者的实现方式与上面的 IAccountService 相同,它是处理所有用户帐户和角色的服务层所有服务层类都实现了一个名为 ServiceBase 的基础服务类,它创建了 DB 上下文
public class ServiceBase
{
protected Context Context;
protected ServiceBase() : this("Context") {}
protected ServiceBase(string dbName)
{
IDatabaseInitializer<Context> initializer = new DbInitialiser();
Database.SetInitializer(initializer);
Context = new Context(dbName);
}
}
拥有 ajax 的控制器
[Authorize(Roles = "Administrator,Supplier")]
public class AuctionController : Controller
{
private IAuctionService _service;
public AuctionController()
{
_service = new AuctionService();
}
public AuctionController(IAuctionService service)
{
_service = service;
}
[CacheControl(HttpCacheability.NoCache), HttpGet]
public ActionResult RefreshAuctionTimes(int auctionId)
{
return PartialView("_AuctionTimer", BusinessLogic.Map.ConvertAuction(_service.GetAuction (auctionId)));
}
}
当我将[Authorize(Roles = "Administrator,Supplier")] 属性添加到处理 ajax 调用的控制器时,问题才开始出现,我知道这是 DbContext 的生命周期,用于应用程序的生命周期,并且控制器服务层被销毁并重新创建每个帖子,但我不确定处理这个问题的最佳方法,我以前使用过这个设置,但使用 DI 和 Windsor,并且从未遇到过这个问题,因为 IOC 正在控制上下文。
最好为提供者创建自己的数据库上下文,还是两个提供者之间存在冲突,他们真的需要共享相同的数据库上下文?
任何帮助都会非常感谢
【问题讨论】:
标签: asp.net asp.net-mvc custom-membershipprovider