繁体   English   中英

交易和 ASP.NET 会员资格 API

[英]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,以便您可以自己管理与数据库的连接。
  • 在开始您的 SubSonic 交易之前预取角色,并根据需要检查相关角色的列表。
  • 您甚至可能不需要存储角色,因为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM