Как делают я звоню, Инициализируют на пользовательском MembershipProvider?

Конструктор Image ожидает спецификацию URL , а не путь к файловой системе. Предполагая, что вы объединяете это изображение как часть своего приложения, вам нужно загрузить его с того же места, где загружаются ваши классы: возможно, файл jar в вашем окончательном развертывании, но, возможно, из файловой системы во время разработки.

Механизм получения URL-адреса, представляющего ресурс, который является частью приложения, заключается в вызове getResource() на Class или ClassLoader .

Точный способ сделать это зависит от структуры вашего проекта, которую вы не показывали, но, например:

new Image(getClass().getResource("Snake/Images/background_options.png").toString(), true);

загрузит изображение из ресурса, указанного относительно текущий класс и

new Image(getClass().getClassLoader().getResource("Snake/Images/background_options.png").toString(), true);

загрузит изображение из ресурса, указанного относительно пути к классу.

Если вы передаете String, который представляет относительный URL ( т.е. без схемы, например file:, http: или jar:), тогда конструктор Image будет искать в пути класса для ресурса. Другими словами,

new Image("Snake/Images/background_options.png", true);

эквивалентно

new Image(getClass().getClassLoader().getResource("Snake/Images/background_options.png").toString(), true);

Это кажется немного противоречащим интуиции (по крайней мере, мне), поэтому я предпочитаю всегда указывать URL полностью, или для получения одного из getClass().getResource() или File.toURI().toURL(), если это необходимо.

19
задан PlayKid 8 March 2009 в 16:47
поделиться

5 ответов

Это верно Ваш Инициализировать метод, должен быть назван автоматически, пока Ваш поставщик настроен правильно (поскольку это, кажется, находится в Вашем примере кода).

необходимо будет разъяснить, как Вы 'назвали его вручную', и где Вы пытались бросить NameValueCollection. Это происходило, внутри Инициализируют?

, Возможно, необходимо ли показать нам Ваш Инициализировать метод (Вы не забыли override ключевое слово, не так ли?;-)

Редактирование: ну, Инициализировать метод кажется прекрасным также.

Следует иметь в виду: Membership статический класс, и он загружает и инициализирует настроенных поставщиков ленивым способом. Таким образом, конструкция Вашего поставщика и вызов к Initialize метод, не произойдут, пока вызов не выполняется, чтобы или Membership.Provider или Membership.Providers свойство. Большинство других статических методов (такой как GetUser()) сделает это, но заключение состоит в том, что Ваш Инициализировать метод, не будет назван, пока API Членства на самом деле не используется.

Вы сделали это, или явно или при помощи Управления входом в систему или тому подобного?

3
ответ дан 30 November 2019 в 02:29
поделиться

В основном поток идет как это,

класс Членства (статический класс) вызовы и использует MembershipProvider (абстрактный класс, полученный из ProviderBase), который реализует SqlMembershipProvider (в Вашем случае MyMemberShipProvider), таким образом Вы дали свою реализацию кода доступа данных к Вашему источнику данных в MyMemberShipProvider, но Вы не называете инициализирование себя.

Инициализирование () является виртуальным методом на ProviderBase при создании MyMemberShipProvider, Вы переопределяете его как ниже

class MyMemberShipProvider : MembershipProvider
{
    private string _connectionStringName;

    public override void Initialize(string name, NameValueCollection config)
    {
       // see the config parameter passed in is of type NameValueCollection 
       // it gives you the chance to get the properties in your web.config
       // for example, one of the properties is connectionStringName

        if (config["connectionStringName"] == null)
        {
            config["connectionStringName"] = "ApplicationServices";
        }
        _connectionStringName = config["connectionStringName"];
        config.Remove("connectionStringName");          
    }
}

Без, видят Ваш код, когда, как Вы говорите, имеют исключение, которое имеет отношение к NameValueCollection, это напоминает мне об этом методе выше.

Hope это помогает, Ray.

1
ответ дан 30 November 2019 в 02:29
поделиться

Пользовательский поставщик Членства инициализируется автоматически, и это не предназначается, чтобы сделать так вручную.

В моей реализации, существует Инициализировать метод как ниже:

public override void Initialize(string name, NameValueCollection config)
{
    if (config == null)
        throw new ArgumentNullException("config");


    // Initialize the abstract base class.
    base.Initialize(name, config);
}

Имеют в виду, что основа. Инициализируйте метод, находится в классе ProviderBase, которому определили следующие исключения:

Исключения:

  • Система. ArgumentNullException: имя поставщика является пустым.
  • Система. ArgumentException: имя поставщика имеет длину нуля.

  • Система. InvalidOperationException: попытка предпринята для вызова Системы. Конфигурация. Поставщик. ProviderBase. Инициализируйте (Система. Строка, Система. Наборы. Специализированный. NameValueCollection) на поставщике после того, как был уже инициализирован поставщик.

Не последнее исключение то, которое Вы получаете?

0
ответ дан 30 November 2019 в 02:29
поделиться

Я пытаюсь понять, что вы сделали ... Думаю, вы поступили следующим образом:

  • Создал собственный класс MyMembershipProvider, унаследовав его от MembershipProvider
  • Настроенный веб .config (мне кажется правильным)
  • Создал веб-элемент управления, который запускает событие, чтобы что-то сделать (например, для аутентификации логина) Затем ...
  • В рамках этого события вы пытались сделать что-то подобное и задаетесь вопросом, почему Initialize () не вызывается при пошаговом выполнении кода:

    MyNameSpace.MyMemberShipProvider msp = new MyNameSpace.MyMemberShipProvider ();
    bool IsAuthorised = msp.ValidateUser (txtLogin, txtPass);

Решение: - Используйте вместо этого:

bool IsAuthorised = Membership.ValidateUser(txtLogin, txtPass);
  • Не создавайте экземпляр своего класса самостоятельно, вместо этого позвольте .NET сделать это за вас с помощью статического класса членства, который гарантирует, что только один экземпляр MyMemberShipProvider существует на протяжении всего времени существования приложения. . Если вы создаете экземпляр своего собственного класса и вызываете Initialize (), ваш код не будет потокобезопасным.
2
ответ дан 30 November 2019 в 02:29
поделиться

Для вызова Initialize () вам необходимо определенным образом создать экземпляр своего настраиваемого поставщика членства. Примерно так:

MyCustomMembershipProvider myProvider = (MyCustomMembershipProvider)Membership.Providers["NameOfMembershipProviderInConfig"];

Теперь, когда вы используете myProvider, будет вызываться Initialize () из вашего настраиваемого провайдера.

46
ответ дан 30 November 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: