【问题标题】:Setting connection string dynamically动态设置连接字符串
【发布时间】:2016-06-22 11:46:52
【问题描述】:

我有一个 Web 应用程序,我正在尝试动态设置成员资格和角色提供者使用的连接字符串。我搜索并发现了一些建议相同的帖子:创建一个通用连接字符串并让成员资格和角色提供者使用它;在 global.asax 中设置连接字符串。像这样的:

Web.config

<connectionStrings>
  <add name="x" connectionString="content placeholder" />
</connectionStrings>

<roleManager enabled="true" defaultProvider="AspNetSqlRoleProvider">
  <providers>
    <remove name="AspNetSqlRoleProvider"/>
    <add name="AspNetSqlRoleProvider" 
      connectionStringName="x" applicationName="/"
        type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>
</roleManager>

<membership defaultProvider="MyMembershipProvider">
  <providers>
    <clear />
    <add name="MyMembershipProvider"
      type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
      connectionStringName="x"
      applicationName="MyApp"
      enablePasswordRetrieval="false"
      enablePasswordReset="true"
      requiresQuestionAndAnswer="false"
      requiresUniqueEmail="false"
      minRequiredNonalphanumericCharacters="0"
      passwordFormat="Hashed" />
  </providers>
</membership>

Global.aspx

private void SetProviderConnectionString(string connectionString)
{
  // Set private property of Membership, Role and Profile providers. 
  var connectionStringField = Membership.Provider.GetType().GetField("_sqlConnectionString", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
  if (connectionStringField != null)
    connectionStringField.SetValue(Membership.Provider, connectionString);

  var roleField = Roles.Provider.GetType().GetField("_sqlConnectionString", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
  if (roleField != null)
    roleField.SetValue(Roles.Provider, connectionString);

    var profileField = ProfileManager.Provider.GetType().GetField("_sqlConnectionString", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    if (profileField != null)
      profileField.SetValue(ProfileManager.Provider, connectionString);
}

protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
  SetProviderConnectionString(Common.msSqlConn);
}

我陷入的是参数“_sqlCONnectionString”。我正在使用 Oracle 11g 数据库。我尝试添加以下内容以查看是否可以获得列表 FieldInfo 但它返回一个空数组:

System.Reflection.FieldInfo[] fi = Membership.Provider.GetType().GetFields();

谁能告诉我“_sqlConnectionString”应该来自哪里,或者我如何修改它以与 Oracle 成员资格/角色提供者一起使用?

我的会员/角色提供者属于以下类型:

type = "Oracle.Web.Security.OracleMembershipProvider, Oracle.Web, Version=2.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342"
type="Oracle.Web.Security.OracleRoleProvider, Oracle.Web, Version=2.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342".

【问题讨论】:

    标签: c# oracle reflection .net-3.5 connection-string


    【解决方案1】:

    对于Oracle,您必须使用“m_OracleConnectionString”代替_sqlConnectionString”。我在未指定任何参数时尝试获取字段信息时出错。我使用:

    System.Reflection.FieldInfo[] fi = Membership.Provider.GetType().GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
    

    列表中的第一个参数是“mOracleConnectionString”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-09
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多