【发布时间】:2018-10-24 19:45:39
【问题描述】:
要修复我的应用程序中的错误,我必须像这样设置 System.Net 程序集中的 ServicePointManager 类的 SecurityProtocolType:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
在 .Net 4.5+ 中,SecurityProtocolType 枚举有四个成员:
public enum SecurityProtocolType
{
Ssl3 48,
Tls 192,
Tls11 768,
Tls12 3072
}
但是,在 .Net 4.0 中,SecurityProtocolType 枚举只有两个成员:
public enum SecurityProtocolType
{
Ssl3 48,
Tls 192
}
因为,我的代码中的另一个项目也需要相同的修复,但该项目位于 .Net 4.0 上,它没有 Tls12 作为枚举成员,this 答案建议以下解决方法(前提是我有 .Net 4.5安装在同一个盒子上):
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
可能是我缺少明显的东西,但我的问题是,当 3072 不是 .Net 4.0 中枚举的有效值时,(SecurityProtocolType)3072 如何解析为 Tls12。我想了解使这项工作在幕后发生了什么魔力。
【问题讨论】:
-
枚举只是以整数形式存储。我不记得我在哪里看到的,但枚举类本质上只是一个静态类,每个枚举值都有一堆公共 const int 成员。这就是为什么当你编写一个 switch 块时,即使你涵盖了枚举中的每个选项,你仍然需要一个默认情况。
ServicePointManager可能只是将枚举值作为 int 传递给底层系统调用,它会识别值3072,即使它没有在枚举中定义 -
stackoverflow.com/questions/6488884/… 这可能会有所帮助,在后台它只是存储为 int,因此调用本质上是无操作
-
@ReeseDeWind 你能详细说明一下“基本上没有操作”吗?如果 no-op 是对 Win32 编程的引用,我对 Win32 编程不熟悉
-
无操作只是一个什么都不做的指令。在您的情况下,编译器基本上发出类似
int SecurityProtocol = (int)3072; -
@AdamG 谢谢,我现在明白了。尽管 .Net 4.0 如何能够理解如何处理 3072 以及它如何赋予它特殊含义,但这仍然没有解释。