ChannelFactory Credentials + объект только для чтения
Приветствую, в чем проблема, когда я пытаюсь установить учетные данные для моей фабрики следующим образом:
ChannelFactory<IWCFSeekService> factory = Factory;
if (factory != null)
{
factory.Credentials.UserName.UserName = CServiceCredentials.Instance.Username;
_Channel = factory.CreateChannel();
}
Я получаю исключение, что объект только для чтения. Это происходит, когда я хочу установить имя пользователя.
3 ответа
Да, документация MSDN довольно ясна:
C#
public ClientCredentials Credentials { get; }
В собственности есть только get
accessor - нет установленного accessor -> только для чтения.
Также в документах MSDN:
замечания
Объект ClientCredentials хранится как тип поведения конечной точки, и к нему можно получить доступ через свойство Behaviors.Метод OnOpened инициализирует доступную только для чтения копию объекта ClientCredentials для фабрики.
Так что же ты здесь делаешь?
ОБНОВЛЕНИЕ: вы не можете установить учетные данные пользователя, которые ваш клиентский прокси должен использовать на фабрике каналов. Посмотрите этот отличный пост в блоге о том, как это сделать в любом случае - с небольшим обходом:
- во-первых, удалите поведение конечной точки по умолчанию из фабрики
- во-вторых, создавать свои собственные учетные данные
в-третьих, установите эти новые учетные данные как поведение новой конечной точки на фабрике
// 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
Кажется немного странным и сложным, но это, кажется, единственный способ достичь этого!
Чтобы завершить этот ответ, действительный способ, которым он работал для всех, как объяснено в
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";
Это решило мою проблему.
Этого не произойдет, если ссылка на службу добавляется через -> Добавить ссылку на службу -> Дополнительно-> Добавить ссылку на веб-> Url/wsdl (файл локального диска).
Сгенерированный файл reference.cs отличается и позволит вам установить учетные данные. Ошибка в том, что вы могли добавить ссылку через сам первый экран (Добавить сервисную ссылку)