ChannelFactory Credentials + объект только для чтения

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

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

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

Ответы

Ответ 1

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

C#
public ClientCredentials Credentials { get; }

Свойство только имеет аксессуар get - нет набора доступа → он только для чтения.

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

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

Метод OnOpened инициализирует только для чтения. Объект ClientCredentials для factory.

Итак, что вы здесь делаете?

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

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

    // step one - find and remove default endpoint behavior 
    var defaultCredentials = factory.Endpoint.Behaviors.Find<ClientCredentials>();
    factory.Endpoint.Behaviors.Remove(defaultCredentials); 
    
    // step two - instantiate your credentials
    ClientCredentials loginCredentials = new ClientCredentials();
    loginCredentials.UserName.UserName = CServiceCredentials.Instance.Username;
    loginCredentials.UserName.Password = "Password123″;
    
    // step three - set that as new endpoint behavior on factory
    factory.Endpoint.Behaviors.Add(loginCredentials); //add required ones
    

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

Ответ 2

Чтобы выполнить этот ответ, фактический способ, которым он работал для всех, как описано в

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/4668e261-0fd0-4ca5-91d2-497aa479f2a9/

Вам не нужно удалять, но переопределять найденные учетные данные:

var credentialBehaviour = factory.Endpoint.Behaviors.Find < ClientCredentials > ();
credentialBehaviour.UserName.UserName = "test";
credentialBehaviour.UserName.Password = "test";

Это решило мою проблему.