我正在使用下面介绍的两种方式在WCF服务中使用第三方https网络服务。
使用服务参考
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();
我能够使用第一种方法传递安全凭证,并且我能够从第三方Web服务获得响应。但是当我使用第二种方法时,我无法得到响应。我可以看到,使用第一种方法将用户名,密码添加到outoing SOAP消息的安全头中,但不是第二种方法。如果有人可以在此处提出有关通道工厂方法的建议,我会很高兴。
答案 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 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();