0

我正在使用下面描述的 2 种方式在 WCF 服务中使用第 3 方 https Web 服务。

  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.使用渠道工厂

  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();

我能够使用第一种方法传递安全凭据,并且能够从第 3 方 Web 服务中获取响应。但是当我使用第二种方法时,我无法获得响应。我可以看到用户名、密码是使用第一种方法添加到外发 SOAP 消息的安全标头中的,而第二种方法则没有。如果有人可以在这里提出有关通道工厂方法的一些建议,我会很高兴。

4

1 回答 1

4

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

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

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

var proxy是一种实现IChannel- 在工厂 ( ) 上设置凭据对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();
于 2013-09-20T23:20:16.060 回答