我的问题:
我有一个webapp(.NET 4.5.1)对外部Web服务进行多次调用。 某些服务仅通过SSL进行通信,而仅通过TSL进行通信。
我知道,出于某种原因,ServicePointManager.SecurityProtocol可以为appdomin静态设置全局(为什么它的全局我不知道),但由于多个调用可以同时发生在不同线程中的不同外部服务 - 我无法为每个服务调用更改appdomain的SecurityProtcol。
问题:
我应该如何在多线程Web应用程序环境中处理此问题? 我应该在不同的应用程序域中生成服务调用,我可以在其中设置SecurityProtocol吗?如果是这样 - 我该怎么做?
答案 0 :(得分:1)
我遇到了这个问题,发现这个解决方案对我有用。
我只使用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连接的属性,但它们都使用相同的方法来验证证书。
答案 1 :(得分:0)
来自Microsoft:
public static SecurityProtocolType SecurityProtocol {get;组; }
此属性选择安全套接字层(SSL)或传输层安全性的版本 (TLS)协议,用于使用安全超文本传输协议(HTTPS)的新连接>方案;现有连接不会更改。
请注意:"用于新连接...现有连接不会更改"
所以,在打开新连接之前更新此属性
答案 2 :(得分:0)
您的应用使用了多少外部服务?你不能事先创建ServicePoints(在应用程序启动时)并在需要时重新使用它们吗?