在多线程环境中调用具有不同证书类型的多个 Web 服务
本文关键字:类型 证书 服务 Web 环境 多线程 调用 | 更新日期: 2023-09-27 18:30:18
我的问题:
我有一个 Web 应用程序 (.NET 4.5.1) 对外部 Web 服务进行多次调用。某些服务仅通过 SSL 进行通信,而其他服务仅通过 TSL 进行通信。
我知道,出于某种原因,ServicePointManager.SecurityProtocol 可以为 appdomin 设置静态全局(为什么它的全局我不知道),但由于可以同时对不同线程中的不同外部服务进行多次调用 - 我不能只为每个服务调用更改应用程序域的 SecurityProtcol。
问题:
在多线程 Web 应用环境中应如何处理此问题?我是否应该在可以设置安全协议的不同应用程序域中生成服务调用?如果是这样 - 我应该怎么做?
我遇到了这个问题,并找到了这个对我有用的解决方案。
我只是使用ServicePointManager
来处理连接证书
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateRemoteCertificate);
private bool ValidateRemoteCertificate(object Sender, X509Certificate Certificate, X509Chain Chain, SslPolicyErrors PolicyErrors)
{
...
}
为了处理不同的请求,我有一个字典将服务器 url 映射到任务。每个任务都是异步运行的,这意味着我不必直接处理线程,并且在我最终使用的每个线程中 System.Net 对象。即HttpWebRequest
、FtpWebRequest
和SmtpWebRequest
。它们中的每一个都有一个启用/禁用 SSL 连接的属性,但它们都使用相同的方法来验证证书。
从 Microsoft:
public static SecurityProtocolType SecurityProtocol { get; set; }
此属性选择安全套接字层 (SSL) 或传输层安全性的版本 (TLS) 协议,仅用于仅使用安全超文本传输协议 (HTTPS)>方案的新连接;现有连接不会更改。
请注意:"用于新连接...现有连接不会更改"
因此,请在打开新连接之前更新此属性
您的应用使用多少个外部服务?您不能事先创建服务点(在应用程序启动时)并在需要时重复使用它们吗?