为ServicePointManager.SecurityProtocol设置每个请求值

chr*_*isb 17 c# ssl httpwebrequest

在c#中,我能够为SSL3或TLS设置静态值,例如

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
Run Code Online (Sandbox Code Playgroud)

要么:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
Run Code Online (Sandbox Code Playgroud)

但是(我相信)这将影响我的应用程序中所有未来的HttpWebRequest对象.

有没有办法为给定的HttpWebRequest或至少为给定的URI设置此值?

注意我看到了这个:

Uri uri = new Uri(url);
ServicePoint sp = ServicePointManager.FindServicePoint(uri);
Run Code Online (Sandbox Code Playgroud)

但ServicePoint没有SecurityProtocol属性.

目前我认为我必须在创建新的HttpWebRequest之前设置静态全局属性.

这感觉不对,这也意味着:

  • 我必须确保多个线程不同时执行此操作.
  • 我不确定这个设置在什么时候被"使用"(即当我调用webRequest.GetResponse()时,是否访问了ServicePointManager.SecurityProtocol并绑定到该URI?).

chr*_*isb 5

意识到这一点已在此处涵盖:

如何在特定的 HttpWebRequest 中使用 SSL3 而不是 TLS?

和这里:

根据请求在 .net HttpWebRequest 上设置 SecurityProtocol(Ssl3 或 TLS)

证实了我的恐惧。一些用户似乎正在启动一个单独的应用程序域来解决这个问题。我仍然认为,如果在设置绑定到特定 Web 请求对象的点上明确定义了某些线程锁定,则它可能是可能的。