【问题标题】:Initialize DefaultRoleProvider connectionstring with code使用代码初始化 DefaultRoleProvider 连接字符串
【发布时间】:2013-02-21 16:26:44
【问题描述】:

我有一个 wbe app mvc c#4.0,我想在运行时从代码中初始化 DefaultRoleProvider 连接字符串(不希望它来自 web.config)。 我创建了一个 MyRoleProvider 类:DefaultRoleProvider

public class MyRoleProvider : DefaultRoleProvider  
{

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

        // Update the private connection string field in the base class.  
        bool IsLocal = bool.Parse(ConfigurationManager.AppSettings["IsLocal"] as string);

        string connectionString = "local connectionString ... ";
        if (IsLocal == false)
            connectionString = "prod connectionString ...";
        //ToDo- how to set connection string next property of provider.  
        ??
    }  
}  

【问题讨论】:

  • 也许您应该尝试在配置中动态设置连接字符串,然后重新加载相应的部分。见msdn.microsoft.com/query/…
  • 我没有更改配置文件的权限。

标签: asp.net-mvc-4 roleprovider


【解决方案1】:

再想一想,你可以尝试一些基于反射的东西,像这样:

public class CustomRoleProvider : SqlRoleProvider  
{    
    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
    {  
        base.Initialize(name, config);

    // Update the private connection string field in the base class.  
    bool IsLocal = bool.Parse(ConfigurationManager.AppSettings["IsLocal"] as string);

    string connectionString = "local connectionString ... ";
    if (!IsLocal)
    {
        connectionString = "prod connectionString ...";
        System.Reflection.FieldInfo field;
        field = this.GetType()
            .GetField("_sqlConnectionString",
                System.Reflection.BindingFlags.Instance 
                | System.Reflection.BindingFlags.NonPublic);
        field.SetValue(this, connectionString);
    }
} 

-------- 首发

恐怕您可以这样做的最好方法是动态选择连接字符串名称,并引用已在 web.config 中声明的另一个连接。像这样的类扩展 SqlRoleProvider

public class CustomRoleProvider : SqlRoleProvider  
{

    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
    {  
        bool IsLocal = bool.Parse(ConfigurationManager.AppSettings["IsLocal"] as string);

        string connectionStringName = "local connectionString name ";
        if (!IsLocal)
            connectionStringName = "prod connectionString name";
        config.Set("connectionStringName", connectionStringName );
        base.Initialize(name, config);
    }  
} 

希望这会有所帮助

【讨论】:

  • 我的请求始于我无权更改 Web 配置文件 :) ... 我想让我的连接字符串在代码中安全。
  • @HaddarMacdasi :想法是将其与 configsource 混合(请参阅msdn.microsoft.com/en-us/library/ms254494%28v=vs.80%29.aspx 中的“使用外部配置文件”)恐怕另一种选择是使用某种反射器或 Resharper 工具反编译 SqlRoleProvider 并在你自己的 RoleProvider 中使用整个代码,修改 Initialize 方法
  • @HaddarMacdasi :对这个主题有另一个想法,编辑了我的答案
猜你喜欢
  • 2013-10-04
  • 2023-03-29
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
相关资源
最近更新 更多