我们有一个WCF应用程序,它既可以作为Windows服务托管,也可以作为控制台应用程序托管。
此应用程序利用智能卡证书来验证对第三方应用程序的某些请求。我们使用以下逻辑从Windows证书存储中获取证书:
public X509Certificate2 GetCertificate(string certificateName)
{
var store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection sel = store.Certificates.Find(X509FindType.FindBySubjectName, certificateName, false);
if (sel.Count == 0)
throw new Exception($"No certificate found with name: {certificateName}");
X509Certificate2 cert = sel.OfType<X509Certificate2>().OrderByDescending(pX => pX.NotAfter).First();
store.Close();
return cert;
}
此代码在Windows 10上运行良好,因此,当客户拥有Windows 10时,我们会将WCF作为Windows Service托管在生产环境中。
但是在Windows 7上,当WCF应用程序作为Windows服务托管时,找不到证书。因此,我们通过将WCF应用程序托管为控制台应用程序来解决此问题。我们需要弄清楚为什么它不能在Windows 7上作为Windows服务运行,尽管如果WCF应用程序作为控制台应用程序托管在同一环境中,它的确会找到证书。