ChannelFactory Credentials +对象是只读的

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)

看起来有点奇怪和复杂,但这似乎是实现这一目标的唯一途径!

  • mark:实际上,ClientCredentials属性有一个setter,但如果凭据是只读的(它是),则抛出它. (2认同)

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)

这解决了我的问题.