我有以下情况。我需要将 .pfx 文件加载到X509Certificate2
对象中并将其用于 WCF 调用:
private IThatWcfService GetService()
{
var binding = new WebHttpBinding();
binding.Security.Mode = WebHttpSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType =
HttpClientCredentialType.Certificate;
// some more minor tweaking of the binding object here which makes reusing the
// WebChannelFactory object below impossible
var endpointAddress = new EndpointAddress( ThatServiceUriConstant );
var contract = ContractDescription.GetContract( typeof( IThatWcfService ) );
var endpoint = new ServiceEndpoint( contract, binding, endpointAddress );
var certificate = loadCertificate(); // news X509Certificate2()
var factory = new WebChannelFactory<IThatWcfService >( endpoint );
factory.Credentials.ClientCertificate.Certificate = certificate;
var service = factory.CreateChannel();
return service;
}
现在的问题是 Windows Server 2008 中存在一个错误,每次将 .pfx 文件加载到X509Certificate2
对象中时,都会导致两个临时文件泄漏。该错误已修复,但该修复在代码运行的地方不可用(并且将不可用),所以我必须解决这个问题。
我已经缓存了这个X509Certificate2
对象,这样当同一个线程GetService()
多次调用时,它X509Certificate2
就会被重用。问题是GetService()
需要从两个线程调用,所以我需要注意X509Certificate2
从不同线程使用的线程安全。
所以我想有以下设计:我制作X509Certificate2
对象static
,无论哪个线程GetService()
首先调用都会创建并缓存X509Certificate2
对象,因此所有线程在组合对象时实际上都使用相同的WebChannelFactory
对象。
X509Certificate2
在对同一个服务进行 WCF 调用时,从多个线程重用同一个对象是否安全?