ChannelFactory Credentials +对象是只读的

时间:2010-03-07 20:01:43

标签: wcf credentials channelfactory

问候,当我尝试为我的工厂设置凭证时,问题是:

ChannelFactory<IWCFSeekService> factory = Factory;
if (factory != null)
{
    factory.Credentials.UserName.UserName = CServiceCredentials.Instance.Username;
    _Channel = factory.CreateChannel();
}

我得到一个异常,即对象是只读的。当我想设置用户名时会发生这种情况。

3 个答案:

答案 0 :(得分:24)

是的,MSDN documentation非常明确:

C#
public ClientCredentials Credentials { get; }

属性具有get访问者 - 没有设置访问者 - &gt;它是只读的。

同样在MSDN文档中:

  

备注
  存储ClientCredentials对象   作为一种端点行为而且可以   通过行为访问   属性。

     

OnOpened方法初始化a   只读副本的   ClientCredentials对象   工厂。

那你在这做什么呢?

更新:您无法设置客户端代理应在通道工厂上使用的用户凭据。无论如何,请参阅此excellent blog post - 稍微绕道而行:

  • 首先,从工厂中删除默认端点行为
  • 其次,实例化您自己的凭据
  • 第三,将这些新凭据设置为工厂

    上的新端点行为
    // 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
    

似乎有点奇怪和复杂,但这似乎是实现这一目标的唯一方法!

答案 1 :(得分:17)

要完成此答案,请按照

中说明的方式为每个人提供实际工作方式

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";

这解决了我的问题。

答案 2 :(得分:-1)

如果通过 - &gt;添加服务引用,则不会发生这种情况。添加服务参考 - &gt;高级 - >添加网络参考 - &gt; Url / wsdl(本地磁盘文件)。

生成的reference.cs文件不同,允许您设置凭据。 该错误是因为您可能已经通过第一个屏幕本身添加了引用(添加服务引用)