更改成员连接字符串



我是asp.net的新成员& &;我需要帮助以编程方式改变其连接字符串。

到目前为止我所尝试的是

我创建了一个类项目名称Sample作为命名空间**,并扩展了System.Web.Security.SqlMembershipProvider

代码

namespace Sample
{
    public class Connectionstring : SqlMembershipProvider
    {
        public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
        {
            string connectionString = "server=xx.xx.xx;database=db;user id=un;password=pwd";    
           // Set private property of Membership provider.  
           FieldInfo connectionStringField = GetType().BaseType
                     .GetField("_sqlConnectionString", BindingFlags.Instance |
                                                       BindingFlags.NonPublic);
           connectionStringField.SetValue(this, connectionString);
        }
    }
}

和成员标签中更改的web配置文件

<membership defaultProvider="SQLMembershipProvider">
  <providers>
    <add name="SQLMembershipProvider" type="sample.Connectionstring,sample" connectionStringName="SQLMembershipConnString" applicationName="@@@@@@@" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" />
  </providers>
</membership>

,而运行的web应用程序项目的连接字符串,我正在改变是不是得到改变?

等待您宝贵的回复和评论

我在网上也发现了这个问题:

一个更简单的,虽然有点令人惊讶的解决方案是修改在请求的提供程序中足够早的连接字符串生命周期:

     private void SetProviderConnectionString(string connectionString)
     {
         var connectionStringField = 
         Membership.Provider.GetType().GetField("_sqlConnectionString", 
                     BindingFlags.Instance | BindingFlags.NonPublic);
         if (connectionStringField != null)
             connectionStringField.SetValue(Membership.Provider, connectionString);
     }

从Global.asax.cs内部调用这个方法application_preequesthandlerexecute完成这项工作。还没有测试过太多了,但即使有些东西不起作用,也只意味着它需要要早一点完成。不能保证这将适用于未来的版本的框架,虽然很可能会。

因此,'SetProviderConnectionString'方法可以手动调用(在Initialize方法完成后),而不是期望框架在成员关系时调用覆盖的Initialize方法。Provider第一次被引用

您似乎没有从Initialize覆盖中调用base.Initialize。我很惊讶在这种情况下还有什么办法。

在。net 4中(不确定早期版本),您应该能够在调用base.Initialize之前将连接字符串添加到配置集合中,如下所示:

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

这避免了使用反射来访问私有字段的需要。

在web配置中不使用连接字符串是什么原因?

通常,web服务器将使用web服务器的凭据访问数据库,而不是使用单个用户的凭据。

这是asp.net身份验证的通用设置指南。http://vstudiojourney.blogspot.com/2008/06/choosing-another-database-for.html

最新更新