代码之家  ›  专栏  ›  技术社区  ›  Mike Cole

自定义ASP.NET sqlMembershipProvider-处理连接字符串

  •  3
  • Mike Cole  · 技术社区  · 14 年前

    我正在创建一个自定义的sqlMembershipProvider类,以向基类添加一些增强的功能。不过,我正忙于处理连接字符串。如何从配置中读取连接字符串名称并使其对其余方法可用?

    现在我有:

    public override void Initialize(string name, NameValueCollection config)
            {
                base.Initialize(name, config);
    
                _ConnectionStringName = config["connectionStringName"];
            }
    

    但在其他方法中,_connectionStringName变量为空:

    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[_ConnectionStringName].ConnectionString)
    

    存储连接字符串名称的正确方法是什么,以便在自定义成员资格提供程序中全局可用?

    谢谢!

    3 回复  |  直到 11 年前
        1
  •  2
  •   Community CDub    8 年前

    ProviderBase 会扔 ConfigurationException 如果在获取配置集合时,配置集合中还剩下任何条目,那么每个提供程序在调用之前都会删除其配置条目 base.Initialize .

    这个问题,正如你所发现的 this answer 您必须在调用 初始化 .

    对不起,我第一眼就没看到。


    这篇文章的其余部分是历史性的,虽然在技术上是正确的,但遗漏了上面列举的突出问题。

    第一次尝试 WebConfigurationManager.ConnectionStrings .

    WebConfigurationManager 处理从windows\microsoft.net\framework\2.0xxxx\web.config一直到应用程序的web.config层次结构的应用。

    这种行为不存在于 ConfigurationManager ,通常处理machine.config到app.config。


    如果这不能解决您的问题,您必须重写代码中其他地方的值,如果确实如此 _ConnectionStringName 正在正确分配 Initialize .

    首先,设置一个断点并确保 _连接字符串名称 正在按预期设置。

    然后找到对该字段的所有引用,并确保没有bug。

    当然,这是假设 _连接字符串名称 是一个私有字段。如果不是,就这样做,并查找编译错误。

        2
  •  2
  •   JK.    11 年前

    不确定这是否有帮助,但我在需要重写sqlMembershipProvider子类中的connectionString时遇到了类似的问题。

    这个想法不是我自己的-我在论坛帖子的评论部分找到了它: http://forums.asp.net/p/997608/2209437.aspx

    public override void Initialize(string name, NameValueCollection config)
    {
         base.Initialize(name, config);<br>
         string connectionString =  //...what you want your connection string to be, 
                                    //so config["connectionStringName"]...
         // Set private property of Membership provider.
         System.Reflection.FieldInfo connectionStringField = 
             GetType().BaseType.GetField("_sqlConnectionString", 
             System.Reflection.BindingFlags.Instance 
             | System.Reflection.BindingFlags.NonPublic);
    
         connectionStringField.SetValue(this, connectionString);
    }
    

    抱歉-我以前从未在这里发布过,所以格式可能低于标准!

        3
  •  1
  •   Community CDub    8 年前

    这可能晚了6个月,无法提供帮助,但我可以通过以下方式获取连接字符串:

    using System.Web.Configuration;
    
    Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
    MembershipSection section = config.SectionGroups["system.web"].Sections["membership"] as MembershipSection;
    string defaultProvider = section.DefaultProvider;
    string connstringName = section.Providers[defaultProvider].ElementInformation.Properties["connectionStringName"].Value.ToString();
    string val = config.ConnectionStrings.ConnectionStrings[connstringName].ConnectionString;
    

    这使得假设默认的提供程序有一个连接字符串属性——但是如果您正在子类化 SqlMembershipProvider 然后应该总是有一个,在web.config链的某个地方(我相信它是在machine.config中定义的)。

    所有这些,添加一个方法到 change the username .