我正在创建一个自定义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)
存储连接字符串名称的正确方法是什么,以便在我的自定义成员资格提供程序中全局可用?
谢谢!
答案 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。