在多线程环境中调用具有不同证书类型的多个Web服务

时间:2014-11-14 11:03:57

标签: c# multithreading web-services certificate

我的问题:

我有一个webapp(.NET 4.5.1)对外部Web服务进行多次调用。 某些服务仅通过SSL进行通信,而仅通过TSL进行通信。

我知道,出于某种原因,ServicePointManager.SecurityProtocol可以为appdomin静态设置全局(为什么它的全局我不知道),但由于多个调用可以同时发生在不同线程中的不同外部服务 - 我无法为每个服务调用更改appdomain的SecurityProtcol。

问题:

我应该如何在多线程Web应用程序环境中处理此问题? 我应该在不同的应用程序域中生成服务调用,我可以在其中设置SecurityProtocol吗?如果是这样 - 我该怎么做?

3 个答案:

答案 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对象。即,HttpWebRequestFtpWebRequestSmtpWebRequest。 它们中的每一个都具有启用/禁用SSL连接的属性,但它们都使用相同的方法来验证证书。

答案 1 :(得分:0)

来自Microsoft:

  

public static SecurityProtocolType SecurityProtocol {get;组; }

     

此属性选择安全套接字层(SSL)或传输层安全性的版本   (TLS)协议,用于使用安全超文本传输​​协议(HTTPS)的新连接>方案;现有连接不会更改。

请注意:"用于新连接...现有连接不会更改"

所以,在打开新连接之前更新此属性

答案 2 :(得分:0)

您的应用使用了多少外部服务?你不能事先创建ServicePoints(在应用程序启动时)并在需要时重新使用它们吗?