Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ChannelFactory Credentials + object is read only

Greetings, what is the problem that when I try to set credentials for my factory as follows:

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

I get an exception that object is read-only. It occurs when I want to set username.

like image 970
niao Avatar asked Mar 07 '10 20:03

niao


2 Answers

Yes, the MSDN documentation is pretty clear:

C#
public ClientCredentials Credentials { get; }

The property only has a get accessor - no set accessor --> it's readonly.

Also in the MSDN docs:

Remarks
The ClientCredentials object is stored as a type of endpoint behavior and can be accessed through the Behaviors property.

The OnOpened method initializes a read-only copy of the ClientCredentials object for the factory.

So what is it you're doing to do here??

UPDATE: you cannot set the user credentials that your client proxy is supposed to use on the channel factory. See this excellent blog post on how to do it anyway - with a bit of a detour:

  • first, remove the default endpoint behavior from the factory
  • secondly, instantiate your own credentials
  • thirdly, set those new credentials as new endpoint behavior on 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
    

Seems a bit odd and complicated, but that seems to be the one and only way to achieve this!

like image 137
marc_s Avatar answered Oct 18 '22 14:10

marc_s


To complete this answer, the actual way in which it worked for everyone as explained at

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

You need not to remove, but override found credentials:

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

This has solved my problem.

like image 21
Morty Avatar answered Oct 18 '22 14:10

Morty