[英]Transaction and ASP.NET Membership API
希望你们中有人去过那里。 我需要做一些涉及多个表的数据库工作。 我正在使用SubSonic 3 SimpleRepository来更新/访问记录。 现在在更新表的调用之间,我调用System.Web.Security.Roles
方法进行一些查找。 我正在使用单个存储库 object 对 DAO 进行所有更新,但是当我的代码命中User.IsInRole("blahblah")
时,它会抛出异常MSDTC is not available on the server
。
我知道这是因为SimpleRepository
正在使用不同的连接,而Membership API
对象正在使用另一个连接。
有没有办法绕过它,或者我必须在我自己的类中包装Membership API
对象?
您可以配置成员资格/角色提供者以使用您需要的连接字符串。
您可以从任何此提供程序继承,并使用事务 scope 包装每个方法的调用,由外部控制。
HttpContext.Current.User.IsInRole()
) 为通过 FormsAuthentication 验证的用户调用RolePrincipal.IsInRole()
。 在内部RolePrincipal.IsInRole()
调用SqlRoleProvider.GetRolesForUser()
,它在方法内创建和销毁SqlConnection
object。
SQL 服务器上可能有其他解决方案来解决这个问题,但是从围栏的 .NET 一侧我只看到以下选项:
IPrincipal
object,以便您可以自己管理与数据库的连接。RolePrincipal.IsInRole()
在调用时会缓存角色,并且只有在缓存为空或无效时才会输出到数据库。 在开始事务之前调用IsInRole()
将预先填充RolePrincipal
对象的缓存,这意味着在 SubSonic 事务中间的后续调用将从缓存中提取角色,而不是连接到数据库来获取它们。我真的不相信最后一个想法是一个好的想法,因为我确信有很多方法可以 go 错误。 我认为最简单的解决方案是在开始 SubSonic 事务之前预取角色。
我希望这会有所帮助。
编辑:为了完整起见,这里是反射器中看到的RolePrincipal.IsInRole()
的实现:
public bool IsInRole(string role)
{
if (this._Identity == null)
{
throw new ProviderException(SR.GetString("Role_Principal_not_fully_constructed"));
}
if (!this._Identity.IsAuthenticated || (role == null))
{
return false;
}
role = role.Trim();
if (!this.IsRoleListCached)
{
this._Roles.Clear();
foreach (string str in Roles.Providers[this._ProviderName].GetRolesForUser(this.Identity.Name))
{
if (this._Roles[str] == null)
{
this._Roles.Add(str, string.Empty);
}
}
this._IsRoleListCached = true;
this._CachedListChanged = true;
}
return (this._Roles[role] != null);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.