问候,当我尝试为我的工厂设置凭证时,问题是:
ChannelFactory<IWCFSeekService> factory = Factory;
if (factory != null)
{
factory.Credentials.UserName.UserName = CServiceCredentials.Instance.Username;
_Channel = factory.CreateChannel();
}
我得到一个异常,即对象是只读的。当我想设置用户名时会发生这种情况。
答案 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文件不同,允许您设置凭据。 该错误是因为您可能已经通过第一个屏幕本身添加了引用(添加服务引用)