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

时间:2010-09-21 16:52:07

标签: asp.net-membership

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

现在我有:

public override void Initialize(string name, NameValueCollection config)
        {
            base.Initialize(name, config);

            _ConnectionStringName = config["connectionStringName"];
        }

但在其他方法中,_ConnectionStringName变量为null:

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

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

谢谢!

3 个答案:

答案 0 :(得分:2)

如果配置集合中有任何条目,那么

ProviderBase将抛出ConfigurationException,因此每个提供程序在调用base.Initialize之前删除它的配置条目。

正如this answer所发现的那样,问题在于您必须在致电base.Initialize之前获取您的值。

对不起,乍一看我错过了。


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

首先 - 尝试WebConfigurationManager.ConnectionStrings

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

ConfigurationManager中不存在此行为,_ConnectionStringName通常将machine.config与app.config相关联。


如果这不能解决您的问题,则必须覆盖代码中其他位置的值,如果Initialize中确实_ConnectionStringName确实已正确分配。{/ p>

首先,设置断点并确保_ConnectionStringName按预期设置。

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

当然,假设{{1}}是私有字段。如果不是,请这样做并查找编译错误。

答案 1 :(得分:2)

不确定这是否有帮助,但我在SqlMembershipProvider的子类中需要覆盖连接字符串时遇到了类似的问题。

这个想法不是我自己的 - 我在本论坛帖子的评论部分找到了它: 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);
}

我道歉 - 我以前从未在这里发布过,所以格式可能不合格!

答案 2 :(得分:1)

这可能需要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

相关问题