Конструктор 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()
, если это необходимо.
Это верно Ваш Инициализировать метод, должен быть назван автоматически, пока Ваш поставщик настроен правильно (поскольку это, кажется, находится в Вашем примере кода).
необходимо будет разъяснить, как Вы 'назвали его вручную', и где Вы пытались бросить NameValueCollection. Это происходило, внутри Инициализируют?
, Возможно, необходимо ли показать нам Ваш Инициализировать метод (Вы не забыли override
ключевое слово, не так ли?;-)
Редактирование: ну, Инициализировать метод кажется прекрасным также.
Следует иметь в виду: Membership
статический класс, и он загружает и инициализирует настроенных поставщиков ленивым способом. Таким образом, конструкция Вашего поставщика и вызов к Initialize
метод, не произойдут, пока вызов не выполняется, чтобы или Membership.Provider
или Membership.Providers
свойство. Большинство других статических методов (такой как GetUser()
) сделает это, но заключение состоит в том, что Ваш Инициализировать метод, не будет назван, пока API Членства на самом деле не используется.
Вы сделали это, или явно или при помощи Управления входом в систему или тому подобного?
В основном поток идет как это,
класс Членства (статический класс) вызовы и использует 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.
Пользовательский поставщик Членства инициализируется автоматически, и это не предназначается, чтобы сделать так вручную.
В моей реализации, существует Инициализировать метод как ниже:
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, которому определили следующие исключения:
Исключения:
Система. ArgumentException: имя поставщика имеет длину нуля.
Система. InvalidOperationException: попытка предпринята для вызова Системы. Конфигурация. Поставщик. ProviderBase. Инициализируйте (Система. Строка, Система. Наборы. Специализированный. NameValueCollection) на поставщике после того, как был уже инициализирован поставщик.
Не последнее исключение то, которое Вы получаете?
Я пытаюсь понять, что вы сделали ... Думаю, вы поступили следующим образом:
В рамках этого события вы пытались сделать что-то подобное и задаетесь вопросом, почему Initialize () не вызывается при пошаговом выполнении кода:
MyNameSpace.MyMemberShipProvider msp = new MyNameSpace.MyMemberShipProvider ();
bool IsAuthorised = msp.ValidateUser (txtLogin, txtPass);
Решение: - Используйте вместо этого:
bool IsAuthorised = Membership.ValidateUser(txtLogin, txtPass);
Для вызова Initialize () вам необходимо определенным образом создать экземпляр своего настраиваемого поставщика членства. Примерно так:
MyCustomMembershipProvider myProvider = (MyCustomMembershipProvider)Membership.Providers["NameOfMembershipProviderInConfig"];
Теперь, когда вы используете myProvider, будет вызываться Initialize () из вашего настраиваемого провайдера.