18

问候,当我尝试为我的工厂设置凭据时出现以下问题:

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

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

4

3 回答 3

25

是的,MSDN 文档非常清楚:

C#
public ClientCredentials Credentials { get; }

该属性只有一个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
    

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

于 2010-03-07T20:55:10.083 回答
21

为了完成这个答案,它对每个人的实际工作方式如在

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

这解决了我的问题。

于 2011-12-28T19:49:50.747 回答
-1

如果通过->添加服务引用->高级->添加Web引用->Url/wsdl(本地磁盘文件)添加服务引用,则不会出现这种情况。

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

于 2018-04-04T14:58:53.803 回答