2016-03-08 119 views
0

我有一个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数据库。我尝试添加下面看看我是否能得到一个列表字段信息,但它返回一个空数组:

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". 

回答

0

对于Oracle,你必须到位_sqlConnectionString的使用“m_OracleConnectionString””我犯了一个错误试图让字段信息时,我没有当。 。指定任何参数我用:

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

,并在名单上的第一个参数是“mOracleConnectionString”