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

3

我正在创建一个自定义的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个回答

2

不确定这是否有帮助,但我遇到了类似的问题,需要在 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);
}

非常抱歉 - 我以前从未在此发布过,因此格式可能不太好!


感谢您的评论。但是,我认为发布的代码不会起作用。似乎base.Initialize方法清除了配置值。这就是我最初遇到的问题。 - Mike Cole

2
ProviderBase 会在获取配置信息时,如果配置集合中还有任何条目,则会抛出 ConfigurationException 异常,因此每个提供程序在调用 base.Initialize 之前都会删除其配置条目。

正如您从这篇答案中发现的那样,问题是您必须在调用 base.Initialize 之前获取值。

抱歉,我一开始没有注意到这点。


本帖子的其余部分是历史性的,虽然技术上是正确的,但错过了上述的关键问题。

首先,请尝试使用 WebConfigurationManager.ConnectionStrings

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

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


如果这不能解决您的问题,那么您必须在代码的其他位置覆盖该值,如果确实在 Initialize 中正确地分配了 _ConnectionStringName

首先,设置断点并确保 _ConnectionStringName 被正确设置。

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

当然,这是假设 _ConnectionStringName 是一个私有字段。如果不是,请将其设置为私有字段并查找编译错误。


我知道如何从web.config中检索连接字符串。我的具体问题是关于从Initialize检索Connection String Name属性并使其在我的其他方法中可用。我设置了断点并且_ConnectionStringName被正确设置,但在我调用另一个方法时它为空值。 - Mike Cole
@mike - 那么你要么引用了另一个成员,要么该成员正在被覆盖。根据提供的信息,没有其他可能的解释。 - Sky Sanders
我会进一步深入检查它。我也很困惑,认为可能有我不知道的陷阱。 - Mike Cole
我在调用base.Initialize之后进行了设置。现在我将其移动到之前,现在它可以正常工作了。谢谢! - Mike Cole
@mike - 如果您查看SqlMembershipProvider的源代码,您会发现它在调用基本方法之前从集合中删除了它所期望的值。如果有任何剩下的值,就会抛出错误。至于这个问题,虽然我一开始没注意到,但我无意中在另一个问题中回答了它。我将更新答案,并解释您代码中的问题。您应该保留原样,以便其他人可以看到问题和解决方案。 - Sky Sanders
有趣。我得记住这个,以备将来应用。 - Mike Cole

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中定义)。

所有这些,只为了添加一个方法来更改用户名


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接