与支持最多的服务器通信的默认安全协议是什么TLS 1.2?将.NET在默认情况下,选择支持在服务器端安全性最高的协议或做我必须明确地添加此行代码:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)
除了代码更改之外,有没有办法更改此默认值?
最后,.NET 4.0只支持TLS 1.0吗?即我必须将客户端项目升级到4.5以支持TLS 1.2.
我的动机是删除SSLv3客户端的支持,即使服务器支持它(我已经有一个powershell脚本在机器注册表中禁用它)并支持服务器支持的最高TLS协议.
更新:
查看ServicePointManager该类,.NET 4.0我看到没有枚举值TLS 1.0和1.1.两者都是.NET 4.0/4.5默认值SecurityProtocolType.Tls|SecurityProtocolType.Ssl3.希望SSLv3在注册表中禁用此默认值不会中断.
但是,我已经决定将所有应用程序升级到.NET 4.5并显式添加SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;到所有应用程序的所有引导代码中.
这将使各种apis和服务的出站请求不降级,SSLv3并应选择最高级别TLS.
这种方法听起来合理还是矫枉过正?我有很多应用程序要更新,我希望将来证明它们,因为我听说甚至TLS 1.0可能在不久的将来被某些提供商弃用.
作为向API发出出站请求的客户端,在注册表中禁用SSL3是否会在.NET框架中产生影响?我默认看到,TLS 1.1和1.2没有启用,我们是否必须通过注册表启用它?RE http://support.microsoft.com/kb/245030.
经过一些调查后,我相信注册表设置将不会有任何影响,因为它们适用于IIS(服务器子项)和浏览器(客户端子项).
对不起,这篇文章变成了多个问题,接着是"可能"的答案.
当我第一次启动我的网站时,我收到了这个错误
Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
我究竟做错了什么?
我正在使用.NET 4并从Visual Studio启动该站点.
我最近唯一改变的是将Simple Injector(通过Nuget)添加到我的项目中.
这是堆栈跟踪
[TypeLoadException: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.]
System.ModuleHandle.ResolveType(RuntimeModule module, Int32 typeToken, IntPtr* typeInstArgs, Int32 typeInstCount, IntPtr* methodInstArgs, Int32 methodInstCount, ObjectHandleOnStack type) +0
System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule module, Int32 typeToken, RuntimeTypeHandle[] typeInstantiationContext, RuntimeTypeHandle[] methodInstantiationContext) +180
System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments) +192
System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord, MetadataImport scope, Assembly& lastAptcaOkAssembly, RuntimeModule decoratedModule, MetadataToken decoratedToken, RuntimeType attributeFilterType, Boolean mustBeInheritable, Object[] attributes, IList derivedAttributes, …Run Code Online (Sandbox Code Playgroud) 我前几天开发了一个针对.NET 4的应用程序,并将XCOPY安装到Windows XP机器上.我告诉机器的所有者他们需要安装.NET Framework 4来运行我的应用程序,他告诉我他做了(不是一个可靠的来源).当我运行应用程序时,我看到一个消息框,说该应用程序需要.NET Framework 4,我想安装它吗?单击是按钮将我带到Microsoft网站,稍后单击几次,安装了.NET 4,并且应用程序已成功启动.
过去,XCOPY将.NET应用程序安装到没有安装正确.NET版本的计算机上,导致应用程序在启动时崩溃,并且没有向用户显示有用的信息.这次为什么不同?
我喜欢这个功能.我想知道将来如何利用它.
在Visual Studio中创建的大多数(如果不是全部)C#(和F#和VB)库和可执行项目中,都有一个自动添加的app.config文件,它指定运行时版本和目标框架名字对象(TFM):
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
. . .
Run Code Online (Sandbox Code Playgroud)
即使app.config完全没有文件,编译器似乎总是生成一个汇编级属性,因为ILDASM显示:
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 // ....NETFramework
.. // ,Version=v4.6.1.
bytes snipped-> .. // .T..FrameworkDis
.. // playName..NET Fr
61 ) // amework 4.6.1
Run Code Online (Sandbox Code Playgroud)
该.csproj文件确实指定了目标框架,我猜这是目标在构建期间从编译器传递到编译器的位置.
如果没有<startup>配置文件中的部分,可执行文件似乎运行得很好.文档解释了什么做的属性意味着,但是,看到他们很多年了,我永远无法理解为什么他们需要在配置文件中 不过,我主要处理Windows的桌面应用程序.
这个答案明确指出"使编译为目标.NET 4.0的程序行为就像它在更高版本上运行一样是不可能的",如果反过来说,在框架的较低版本上运行程序也会让我感到非常惊讶可能.
那么,在什么情况下,应用程序开发人员需要在应用程序的.config文件中指定运行时的版本和TFM ,并且是否必须始终复制编译器硬编码到二进制文件中的信息?这项要求乍一看似乎违反直觉.
更新2018-06-29:X-ref:我要求澄清GitHub问题dotnet/docs#6234中的文档.