WCF Channel Factory与Service Reference的身份验证差异

时间:2013-09-20 20:07:50

标签: c# wcf

我正在使用下面介绍的两种方式在WCF服务中使用第三方https网络服务。

  1. 使用服务参考

    ServiceClient client=new ServiceClient();
    client.ClientCredentials.UserName.UserName ="xxx";
    client.ClientCredentials.UserName.Password = "pwd";
    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain,                       sslPolicyErrors) => true;
    ServiceResponse response=client.GetData();
    
  2. 2.使用渠道工厂

      ChannelFactory<IService> client = new ChannelFactory<IService>(binding, address);
      var proxy = client.CreateChannel();
      client.Credentials.UserName.UserName ="xxx";
      client.Credentials.UserName.Password ="pwd";
      ServiceResponse response=client.GetData();
    

    我能够使用第一种方法传递安全凭证,并且我能够从第三方Web服务获得响应。但是当我使用第二种方法时,我无法得到响应。我可以看到,使用第一种方法将用户名,密码添加到outoing SOAP消息的安全头中,但不是第二种方法。如果有人可以在此处提出有关通道工厂方法的建议,我会很高兴。

1 个答案:

答案 0 :(得分:4)

问题在于您分配凭据时 - 在当前代码中,您在创建工厂后创建代理,然后然后将凭据分配给工厂。但这对创建的频道没有影响:

ChannelFactory<IService> client = new ChannelFactory<IService>(binding, address);
var proxy = client.CreateChannel();

client.Credentials.UserName.UserName ="xxx";
client.Credentials.UserName.Password ="pwd";

var proxyIChannel的一个实现 - 在工厂设置凭据(client)对已创建的频道没有影响 - 只是稍后创建的频道。

尝试设置凭据,然后调用CreateChannel()

ChannelFactory<IService> client = new ChannelFactory<IService>(binding, address);
client.Credentials.UserName.UserName ="xxx";
client.Credentials.UserName.Password ="pwd";

var proxy = client.CreateChannel();
ServiceResponse response=client.GetData();