18

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.

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
niao
  • 4,972
  • 19
  • 66
  • 114

3 Answers3

26

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!

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
  • 1
    but look at my code..first I create a ChannelFactory..then I set credentials. – niao Mar 07 '10 at 21:06
  • but I can't as my _Channel is of type IWCFSeekFactory – niao Mar 07 '10 at 21:10
  • 1
    well, I finally fixed it. I can specify credentials in ChannelFactory as it is in my code, the problem was that previous in code I've also created some Channel which was unnessesary – niao Mar 08 '10 at 07:33
  • 3
    mark: actually, ClientCredentials property has a setter, but it throws if the credentials is read-only (which it is). – Tor Haugen Oct 12 '10 at 01:59
  • 1
    Isn't the confusion in the first part of this question due to the wrong property being shown on MSDN, the relevant one for me, after getting this error is the NetworkCredentials type property 'ClientCredential' (which does have a setter but can give a read-only exception) - http://msdn.microsoft.com/en-us/library/vstudio/system.servicemodel.security.windowsclientcredential.clientcredential%28v=vs.100%29.aspx – PandaWood Sep 17 '12 at 02:37
  • 1
    Thank You ! so much for sharing this solution really helped me to fix the issue! Many Thanks !. – Mirzan Sep 21 '20 at 07:02
21

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.

Tom van der Woerdt
  • 29,532
  • 7
  • 72
  • 105
Rick
  • 528
  • 1
  • 6
  • 15
-1

This will not happen if the service reference is added through -> Add service reference ->Advanced->Add Web Reference-> Url/wsdl (local disk file).

The reference.cs file generated is different and will allow you to set credentials. The error is because you might have added the reference through first screen itself (Add service reference)

Blue Clouds
  • 7,295
  • 4
  • 71
  • 112