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.
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!
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.
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)
精彩评论