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

C# 在多线程环境中使用不同的证书类型调用多个Web服务,c#,multithreading,web-services,certificate,C#,Multithreading,Web Services,Certificate,我的问题: 我有一个webapp(.NET 4.5.1)对外部Web服务进行多次调用。 一些服务仅通过SSL进行通信,而另一些服务仅通过TSL进行通信 我知道,出于某种原因,ServicePointManager.SecurityProtocol可以为appdomain静态全局设置(我不知道为什么它是全局的),但由于可以同时对不同线程中的不同外部服务进行多个调用,因此我不能只为每个服务调用更改appdomain的SecurityProtocol 问题: 我应该如何在多线程web应用程序环境中处理

我的问题:

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

我知道,出于某种原因,ServicePointManager.SecurityProtocol可以为appdomain静态全局设置(我不知道为什么它是全局的),但由于可以同时对不同线程中的不同外部服务进行多个调用,因此我不能只为每个服务调用更改appdomain的SecurityProtocol

问题:

我应该如何在多线程web应用程序环境中处理此问题? 我是否应该让服务调用在可以设置SecurityProtocol的不同AppDomain中生成?如果是这样的话,我应该怎么做呢?

来自微软:

公共静态SecurityProtocol类型SecurityProtocol{get;set;}

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

请注意:“用于新连接…现有连接未更改”


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

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

我遇到了这个问题,找到了适合我的解决方案

我只是使用
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连接,但它们都使用相同的方法来验证证书。

正如我在问题中所写的,我知道如何使用静态属性,但是,它在多线程环境中不起作用,因为在创建服务调用期间,多个线程可以调整静态。它基本上需要是线程安全的解决方案。“现有连接未更改。”仅适用于allready created服务调用。是的,您需要在案例中锁定,以便能够设置属性并创建调用,然后释放锁井,这将需要我在每个服务调用上使用相同的锁,这将有效地为需要在单个用户服务调用期间获取服务数据的所有用户锁定webapplication。这是一个解决方案,只是不是一个非常有用的解决方案。在多线程环境中创建和使用自定义通道是否适合您的用例。如果它能够解决我向okarpov bellow描述的线程问题,那么当然可以。