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 отличается и позволит вам установить учетные данные. Ошибка в том, что вы могли добавить ссылку через сам первый экран (Добавить сервисную ссылку)

Другие вопросы по тегам