在WCF中设置ClientCredentials时出现"Object is read only"错误

Pau*_*ski 18 wcf visual-studio

我有一个名为ServerClient的Visual Studio(客户端)生成的代理对象.我试图在使用此代码打开新连接之前设置ClientCredentials.UserName.UserName/Password:

InstanceContext context = new InstanceContext(this);

m_client = new ServerClient(context);
m_client.ClientCredentials.UserName.UserName = "Sample";
Run Code Online (Sandbox Code Playgroud)

一旦代码命中UserName行,它就会失败并显示"Object is read-only"错误.我知道如果连接已经打开或出现故障会发生这种情况,但此时我还没有调用context.Open().

我已将Bindings(使用netTcpBinding)配置为使用Message作为其安全模式,并将MessageClientCredentialType设置为UserName.

有任何想法吗?

小智 13

我注意到在为服务创建代理类的实例后,我可以设置一次没有错误的用户名和密码,并成功调用我的webservice.当我尝试在现有实例上再次设置用户名和密码时(当然不需要),我得到你提到的'对象是只读'错误.每个实例生命周期设置一次值对我有用.

  • 更合适的是,需要在调用任何服务方法之前设置凭据。在调用方法后尝试设置凭据会出错 - 凭据在您进行服务调用时已隐式设置,现在无法更改;它们是不可变的。 (3认同)

Pau*_*ski 8

您似乎只能在实例化周期中很早就访问这些属性.如果我覆盖代理类(ServerClient)中的构造函数,我可以设置这些属性:

base.ClientCredentials.UserName.UserName = "Sample";
Run Code Online (Sandbox Code Playgroud)

我开始欣赏那些建议不使用VS提供的自动构建代理的人.


小智 6

这是解决方案:

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);
Run Code Online (Sandbox Code Playgroud)