.NET Standard 2.0类库中使用X509证书调用WCF服务的问题
解决方案:在.NET Standard 2.0中配置WCF证书认证客户端
嘿,我之前在.NET Standard里调用WCF服务时也碰到过这个问题,确实和.NET Framework的配置逻辑有点不一样,给你几个靠谱的解决思路:
方案1:改用BasicHttpBinding配置Transport安全
BasicHttpsBinding在.NET Standard里的初始化限制比较多,换用BasicHttpBinding并指定Transport安全模式会更灵活,代码如下:
private TestServiceClient GetTestServiceClient() { var address = new EndpointAddress("https://known.to.be/working/service/endpoint"); // 通过构造函数直接指定HTTPS安全模式 var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport); binding.Name = "basic_SSL_Cert"; // 直接设置证书认证类型 binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; // 这里继续添加你原有的其他绑定属性配置... var client = new TestServiceClient(binding, address); client.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectDistinguishedName, "I can find the cert no problem." ); return client; }
这个方案的核心是利用BasicHttpBinding的构造函数直接初始化安全模式,这样后续就能正常修改Security.Transport下的所有属性,完全适配你的证书认证需求。
方案2:直接修改BasicHttpsBinding的现有Security属性
如果你坚持要用BasicHttpsBinding,其实不需要手动实例化BasicHttpsSecurity——.NET Standard中BasicHttpsBinding初始化时已经自动创建了这个实例,你直接修改现有属性就行:
private TestServiceClient GetTestServiceClient() { var address = new EndpointAddress("https://known.to.be/working/service/endpoint"); var binding = new BasicHttpsBinding(); binding.Name = "basic_SSL_Cert"; // 不需要new BasicHttpsSecurity,直接修改现有实例的属性 binding.Security.Mode = BasicHttpsSecurityMode.Transport; binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; // 其他绑定属性配置... var client = new TestServiceClient(binding, address); client.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectDistinguishedName, "I can find the cert no problem." ); return client; }
这是因为在.NET Standard的WCF实现中,BasicHttpsBinding.Security是一个已初始化的只读属性(或者说不允许重新赋值),所以你不需要手动构造新的BasicHttpsSecurity对象,直接修改它的子属性即可。
必查项:确认NuGet依赖是否正确
最后别忘了检查你的.NET Standard 2.0类库是否安装了System.ServiceModel.Http NuGet包,这是.NET Standard中使用WCF客户端的核心依赖,如果缺失的话可能会出现属性无法访问、类型找不到等问题。
内容的提问来源于stack exchange,提问作者Urk
相关产品推荐
相关产品推荐

