ChannelFactory Credentials + object is read only
Asked Answered
C

3

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.

Cagle answered 7/3, 2010 at 20:1 Comment(0)
D
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!

Delk answered 7/3, 2010 at 20:55 Comment(6)
but look at my code..first I create a ChannelFactory..then I set credentials.Cagle
but I can't as my _Channel is of type IWCFSeekFactoryCagle
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 unnessesaryCagle
mark: actually, ClientCredentials property has a setter, but it throws if the credentials is read-only (which it is).Alo
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) - msdn.microsoft.com/en-us/library/vstudio/…Tedman
Thank You ! so much for sharing this solution really helped me to fix the issue! Many Thanks !.Shumate
I
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.

Iorgo answered 28/12, 2011 at 19:49 Comment(0)
M
-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)

Marden answered 4/4, 2018 at 14:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.