【问题标题】:Changing membership connection string更改会员连接字符串
【发布时间】:2013-03-07 07:32:35
【问题描述】:

我是 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);
        }
    }
}

并将会员标签中的网络配置文件更改为

<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 应用程序项目时,我正在更改的连接字符串不会被更改?

等待您的宝贵回复和cmets

【问题讨论】:

标签: c# .net connection-string sqlmembershipprovider


【解决方案1】:

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

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

     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_PreRequestHandlerExecute 完成这项工作。没测试过 太多了,但即使有些东西不起作用,也只是意味着它需要 要早点完成。不保证这将适用于未来的版本 框架,尽管很可能会。

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

【讨论】:

    【解决方案2】:

    您似乎没有通过 Initialize 覆盖调用 base.Initialize。我很惊讶在这种情况下一切正常。

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

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

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

    【讨论】:

      【解决方案3】:

      你为什么不在网络配置中使用连接字符串?

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

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

      【讨论】:

        猜你喜欢
        • 2015-06-11
        • 2018-09-20
        • 2016-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-15
        相关资源
        最近更新 更多