2016-03-08 4 views
0

У меня есть веб-приложение, и я пытаюсь установить строку соединения, используемую поставщиками членства и роли динамически. Я искал и наткнулся на несколько сообщений, которые предлагали то же самое: создать общую строку соединения и использовать ее поставщики членства и роли; установите строку соединения в 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". 

ответ

0

Для Oracle, вы должны использовать «m_OracleConnectionString» вместо _sqlConnectionString»Я сделал ошибку при попытке получить данные поля, когда я не сделал. . указать любые параметры, я использовал:

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

и первый параметр в списке был «mOracleConnectionString»

.
Смежные вопросы