Учетные данные ChannelFactory + объект только для чтения

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

ChannelFactory<IWCFSeekService> factory = Factory;
if (factory != null)
{
    factory.Credentials.UserName.UserName = CServiceCredentials.Instance.Username;
    _Channel = factory.CreateChannel();
}

Я получаю исключение, что объект только для чтения. Происходит, когда я хочу установить имя пользователя.

16
задан marc_s 7 March 2010 в 20:57
поделиться

1 ответ

Да, в документации MSDN довольно ясно сказано:

C#
public ClientCredentials Credentials { get; }

Свойство only имеет аксессор get - нет аксессора set -> оно readonly.

Также в документации MSDN:

Remarks
Объект ClientCredentials хранится как тип поведения конечной точки и может получить доступ к нему через свойство Behaviors свойство.

Метод OnOpened инициализирует копию объекта объекта ClientCredentials для фабрики.

Так что же вы здесь делаете?

UPDATE: вы не можете установить учетные данные пользователя, которые ваш клиентский прокси должен использовать на фабрике каналов. Смотрите эту отличную статью в блоге о том, как это сделать в любом случае - с небольшим отступлением:

  • во-первых, удалите поведение конечной точки по умолчанию из фабрики
  • во-вторых, создайте свои собственные учетные данные
  • в-третьих, установите эти новые учетные данные как новое поведение конечной точки на фабрике

    // шаг первый - найти и удалить поведение конечной точки по умолчанию 
    var defaultCredentials = factory.Endpoint.Behaviors.Find();
    factory.Endpoint.Behaviors.Remove(defaultCredentials); 
    
    // шаг второй - инстанцирование учетных данных
    ClientCredentials loginCredentials = new ClientCredentials();
    loginCredentials.UserName.UserName = CServiceCredentials.Instance.Username;
    loginCredentials.UserName.Password = "Password123″;
    
    // шаг третий - устанавливаем это как новое поведение конечной точки на фабрике
    factory.Endpoint.Behaviors.Add(loginCredentials); //добавляем требуемое
    

Кажется немного странным и сложным, но это, похоже, единственный способ добиться этого!

24
ответ дан 30 November 2019 в 16:18
поделиться
Другие вопросы по тегам:

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