ASP .NET MVC中的web.config中的TargetFramework设置是什么意思?


78

我们的ASP.NET MVC 5 Web应用程序之一具有以下web.config设置:

<system.web>
  <compilation debug="true" targetFramework="4.6" />
  <httpRuntime targetFramework="4.5" />
  <!--... many other things -->
</system.web>

尚不清楚为什么有两个targetFramework设置,并且编译目标4.6然后尝试在4.5下运行似乎是错误的。

显然我缺少了什么,但是呢?


Answers:


57

targetFramework存在的原因web.config是为了避免在.NET Framework每个版本的重大更改之间存在兼容性问题。targetFrameworkoncompilation和之间的区别在于httpRuntime每个开发和部署环境。

根据MSDN博客

<compilation targetFramework="4.6" />

选择在执行编译时使用哪个版本的.NET Framework参考程序集。(注意:即使我们自动推断,Visual Studio要求该元素也必须存在于Web.config中。)

该元素确定在编译期间用于从当前项目创建依赖项和相关程序集的程序集版本。

<httpRuntime targetFramework="4.5" /> 表示当前项目设计为使用.NET 4.5运行时程序集,而无需在加载到内存中之前重新编译部署计算机中的现有项目程序集。

因此,我们可以得出结论,targetFrameworkhttpRuntime元素中定义的版本号旨在在运行时使用中维护编译的项目与可用程序集之间的兼容性,具体取决于目标计算机中使用的运行时文件的版本。

因此,在您的情况下,这不是错误的行为,项目创建者只想保持运行时兼容性为目标计算机中具有类似特征的最低运行时版本(即4.5版),甚至是使用较新版本的项目编译的项目。 .NET程序集。4.5版和4.6版之间的差异相对较小,因此在这种情况下仍可以将运行时版本降至4.5版。

相关参考:

https://msdn.microsoft.com/zh-CN/library/dn833123(v=vs.110).aspx

https://msdn.microsoft.com/zh-CN/library/dn833125(v=vs.110).aspx


8
也许是我,我仍然不明白当我们选择4.6时使用“ ...设计为使用.NET 4.5 ...”的东西“ ...在执行编译时使用.NET Framework参考程序集的版本...”
g.pickardou

2
.NET 4.6是.NET 4.5的子集更新,因此也基于.NET 4.5程序集引用,但有一些细微差别(请注意,自2.0版以来,.NET具有向后兼容性支持)。实际上,该项目将使用4.6版程序集引用进行编译,但是当更高版本的引用不可用时,便能够在目标计算机上使用4.5版运行时引用。
2016年

4
您指的是“向后兼容性”。但是,按定义,这意味着:期望较低版本的事物将在较高版本的上下文中无缝运行。(因为更高的版本向后兼容”,而不是反向
。– g.pickardou

4
在msdn上找到了一篇可以解释得更多的好文章。blogs.msdn.microsoft.com/webdev/2012/11/19/…–
dev

2
这个答案看起来太错误了,答题者已经把答案放到了最前面。因此,如果我使用4.6中的功能并对其进行编译,那么当我部署到目标服务器(4.5)时,该应用程序应该会失败,因为上述功能在较早的版本中不存在。
joedotnot

9

根据我的理解<compilation debug="true" targetFramework="4.6" /><httpRuntime targetFramework="4.5" />因为httpRuntime被翻译成以下内容而被压制

<compilation targetFramework="4.5" />
<machineKey compatibilityMode="Framework45" />
<pages controlRenderingCompatibilityVersion="4.5" />

因此,以上设置可能是由于某些误解或错误,如果直接由VS完成,我认为这是不对的。

要了解此设置和所有其他相关内容如何意味着由Microsoft员工撰写的标题为“关于<httpRuntime targetFramework>的全部”的博客可能会对您有所帮助。但是要点是:

当在计算机上更新现有框架时,.NET Framework(包括ASP.NET)将努力保持接近100%的兼容性。我们尝试尽可能确保如果针对.NET Framework 4开发和部署了应用程序,则该应用程序将继续在4.5上运行。这通常意味着在版本之间保持产品中的古怪,错误或不良行为,因为修复它们可能会对依赖那些行为的应用程序产生负面影响。


4
在博客文章中,它建议在web.config中显式设置的任何设置都不会被httpRuntime设置所隐含的内容覆盖:“即使<httpRuntime targetFramework =“ 4.5” />通常隐含<pages controlRenderingCompatibilityVersion = “ 4.5” />,运行时将注意到您已经显式设置了controlRenderingCompatibilityVersion并将尊重您的设置。
code4pi

2
仅作为参考,如果在未设置httpRuntime的情况下设置了编译,则machinekey和pages设置的默认值将不为4.5,需要手动进行设置。这在尝试在旧版网站与.net核心网站之间共享cookie时非常重要。
Jarvan

如果编译和HttpRuntime都缺少targetFramework,则该怎么解释?
Anirudh Goel

请由Google确认,但我认为这些属性用于将应用程序和框架的范围限制为特定版本,但是,如果未指定,则可能会假设没有任何限制,并且将尝试运行安装的最新版本。这可能不是一个好主意,尽管假设您在安装可能正在使用最新框架功能(例如4.7.2)的另一个应用程序时,某些应用程序在旧版本(例如4.0)中运行。
Mubashar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.