nia*_*iao 16 wcf credentials channelfactory
问候,当我尝试为我的工厂设置凭证时,问题是:
ChannelFactory<IWCFSeekService> factory = Factory;
if (factory != null)
{
factory.Credentials.UserName.UserName = CServiceCredentials.Instance.Username;
_Channel = factory.CreateChannel();
}
Run Code Online (Sandbox Code Playgroud)
我得到一个异常,即对象是只读的.当我想设置用户名时会发生这种情况.
mar*_*c_s 24
是的,MSDN文档很清楚:
C#
public ClientCredentials Credentials { get; }
Run Code Online (Sandbox Code Playgroud)
该物业只有一个get访问者 - 没有设置访问者 - >它是只读的.
也在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
Run Code Online (Sandbox Code Playgroud)看起来有点奇怪和复杂,但这似乎是实现这一目标的唯一途径!
Mor*_*rty 18
要完成这个答案,它的实际工作方式对每个人都有用,如下所述
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";
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题.