2008-10-13 28 views
17

我有一个由Visual Studio(客户端)生成的名为ServerClient的代理对象。我试图用这个代码打开了一个新的连接之前设置ClientCredentials.UserName.UserName /密码:在WCF中设置ClientCredentials时出现“Object is read only”错误

InstanceContext context = new InstanceContext(this); 

m_client = new ServerClient(context); 
m_client.ClientCredentials.UserName.UserName = "Sample"; 

只要命中代码用的用户名行失败“对象是只读的”错误。我知道如果连接已经打开或发生故障,可能会发生这种情况,但此时我还没有调用context.Open()。

我已经配置绑定(使用netTcpBinding)使用消息,因为它是安全模式,并且MessageClientCredentialType设置为UserName。

任何想法?

回答

8

看来你只能在instanciation周期的早期访问这些属性。如果我重写代理类(ServerClient)构造函数中,我能够设置这些属性:

base.ClientCredentials.UserName.UserName = "Sample"; 

我开始欣赏谁建议不要使用自动生成代理由VS.提供的人

+0

我使用微软的代理的唯一原因是因为它会自动生成异步方法.. – 2017-03-29 10:59:01

0

我认为你的问题可能与使用InstanceContext有关。我认为这仅仅是来自服务器端的双工通信信道所需要的。

我承认我不确定这一点,但我认为在这种情况下,您要告诉客户端使用现有的实例上下文,以便它认为已经有一个正在运行的服务并且不允许更改。

什么是驱动使用InstanceContext?

1

我有一个的传球UserName罚款类似的代码:

FooServiceClient client = new FooServiceClient("BasicHttpBinding_IFooService"); 
    client.ClientCredentials.UserName.UserName = "user"; 
    client.ClientCredentials.UserName.Password = "password"; 

尝试在app.config中绑定的名称创建代理。

5

这里是colution:

using SysSvcmod = System.ServiceModel.Description; 

SysSvcmod.ClientCredentials clientCredentials = new SysSvcmod.ClientCredentials(); 
clientCredentials.UserName.UserName = "user_name"; 
clientCredentials.UserName.Password = "pass_word"; 

m_client.ChannelFactory.Endpoint.Behaviors.RemoveAt(1); 
m_client.ChannelFactory.Endpoint.Behaviors.Add(clientCredentials); 
0

如果使用双工客户端,当你初始化它DuplexClientBase内DuplexChannelFactory您的客户端从与现有凭据初始化,以便它可以打开回调通道导出,这就是为什么证书只能读取的原因。

我第二个Mike的问题,也问你为什么要使用NetTcpBinding,如果你不打算使用其固有的传输级别的安全性?也许基于HTTP的绑定会更合适?这将允许您使用基于证书的安全性,我相信在实例化后可以对其进行修改(http://msdn.microsoft.com/en-us/library/ms576164.aspx)。

0

在黑暗中拍摄,但netTcpBinding允许用户名和密码验证?尝试使用http绑定尝试使用应用层(SOAP)安全

12

我注意到,在为服务创建代理类的实例之后,我可以一次性设置用户名和密码,并成功地调用我的web服务。当我然后尝试在现有实例上重新设置用户名和密码(当然不必要),我得到了你提到的'Object is Read-Only'对象。每个实例的生命周期设置一次值为我工作。

+0

更恰当,证书需要被调用的任何服务方法之前进行设置。尝试在调用方法后设置凭据会导致错误 - 当您进行服务调用时,凭据将被隐式设置,并且现在无法更改;它们是不可变的。 – morpheus 2013-03-07 23:20:13

0

正确的语法是:

//删除ClientCredentials行为。 client.ChannelFactory.Endpoint.Behaviors.Remove <ClientCredentials>();

//向行为集合添加自定义客户端凭证实例。 client.ChannelFactory.Endpoint.Behaviors.Add(new MyClientCredentials());

http://msdn.microsoft.com/en-us/library/ms730868.aspx

它为我工作。

0

我面临同样的问题,我的代码在我更改我的代码时开始工作,即在初始化客户端对象后立即将值分配给客户端凭证。

这里是解决方案,

ProductClient Manager = new ProductClient();  
Manager.ClientCredentials.UserName.UserName = txtUserName.Text; 
Manager.ClientCredentials.UserName.Password = txtPassword.Text; 
相关问题