Пользовательский ASP.NET SqlMembershipProvider - обработка строки подключения - PullRequest
3 голосов
/ 21 сентября 2010

Я создаю собственный класс SqlMembershipProvider для добавления некоторых расширенных функциональных возможностей в базовый класс. Однако, я разбираюсь с обработкой строки подключения. Как я могу прочитать имя строки подключения из конфигурации и сделать его доступным для остальных методов?

Прямо сейчас у меня есть:

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

            _ConnectionStringName = config["connectionStringName"];
        }

Но в других методах переменная _ConnectionStringName имеет значение null:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[_ConnectionStringName].ConnectionString)

Как правильно сохранить имя строки подключения, чтобы оно было доступно глобально в моем настраиваемом поставщике членства?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 25 сентября 2010

Не уверен, поможет ли это, но у меня возникла похожая проблема, связанная с необходимостью переопределить строку подключения в подклассе SqlMembershipProvider.

Эта идея не моя собственная - я нашел ее в разделе комментариев этого сообщения на форуме: http://forums.asp.net/p/997608/2209437.aspx

public override void Initialize(string name, NameValueCollection config)
{
     base.Initialize(name, config);<br>
     string connectionString =  //...what you want your connection string to be, 
                                //so config["connectionStringName"]...
     // Set private property of Membership provider.
     System.Reflection.FieldInfo connectionStringField = 
         GetType().BaseType.GetField("_sqlConnectionString", 
         System.Reflection.BindingFlags.Instance 
         | System.Reflection.BindingFlags.NonPublic);

     connectionStringField.SetValue(this, connectionString);
}

Мои извинения - я никогда не публиковал здесь раньше, поэтому форматирование может быть ниже номинала!

2 голосов
/ 23 сентября 2010

ProviderBase сгенерирует ConfigurationException, если к моменту его получения в коллекции конфигурации останутся какие-либо записи, поэтому каждый провайдер удаляет свои записи конфигурации перед вызовом base.Initialize.

Проблема, как вы обнаружили в результате этого ответа , заключается в том, что вы должны получить свои значения перед вызовом base.Initialize.

Извините, я пропустил это впервый взгляд.


Остальная часть этого поста является исторической, и хотя технически правильно пропускает существенную проблему здесь, как перечислено выше.

Первый - попробуйте WebConfigurationManager.ConnectionStrings.

WebConfigurationManager обрабатывает применение иерархии web.config на всем пути от вашего windows \ microsoft.net \ framework \ 2.0xxxx \ web.config до вашего приложения.

Это поведение отсутствует в ConfigurationManager, который обычно имеет дело с machine.config для app.config.


Если это не решит вашу проблему, вы должны перезаписать значение в другом месте вашего кода,если действительно _ConnectionStringName назначается правильно в Initialize.

Сначала установите точку останова и убедитесь, что _ConnectionStringName устанавливается так, как ожидается.

Затем найдите все ссылки на полеи убедитесь, что у вас нет ошибки.

ThКонечно, предполагается, что _ConnectionStringName является частным полем.Если это не так, сделайте это и поищите ошибку компиляции.

1 голос
/ 27 февраля 2011

Это, вероятно, на 6 месяцев позже, чтобы помочь, но я смог получить строку подключения следующим образом:

using System.Web.Configuration;

Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
MembershipSection section = config.SectionGroups["system.web"].Sections["membership"] as MembershipSection;
string defaultProvider = section.DefaultProvider;
string connstringName = section.Providers[defaultProvider].ElementInformation.Properties["connectionStringName"].Value.ToString();
string val = config.ConnectionStrings.ConnectionStrings[connstringName].ConnectionString;

Предполагается, что поставщик по умолчанию имеет свойство строки подключения - но если вы создаете подкласс SqlMembershipProvider, тогда всегда должно быть одно, где-то в цепочке web.config (это определено в machine.config, я считаю) .

Все это, чтобы добавить один метод к , изменить имя пользователя .

...