Поздравления, что является проблемой это, когда я пытаюсь установить учетные данные для своей фабрики следующим образом:
ChannelFactory<IWCFSeekService> factory = Factory;
if (factory != null)
{
factory.Credentials.UserName.UserName = CServiceCredentials.Instance.Username;
_Channel = factory.CreateChannel();
}
Я получаю исключение, что объект только для чтения. Происходит, когда я хочу установить имя пользователя.
Да, в документации 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); //добавляем требуемое
Кажется немного странным и сложным, но это, похоже, единственный способ добиться этого!