【问题标题】:What do the TargetFramework settings mean in web.config in ASP .NET MVC?ASP .NET MVC 的 web.config 中的 TargetFramework 设置是什么意思?
【发布时间】:2017-03-03 09:45:00
【问题描述】:

我们的一个 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下运行似乎是错误的...

显然我错过了什么,但是什么?

【问题讨论】:

标签: asp.net asp.net-mvc


【解决方案1】:

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

根据MSDN blog

<compilation targetFramework="4.6" />

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

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

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

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

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

相关参考资料:

【讨论】:

  • 也许是我,我仍然不明白“...设计为使用 .NET 4.5...”当我们使用 4.6 时选择“...一个 .NET 版本执行编译时使用框架的参考程序集..."
  • .NET 4.6 是 .NET 4.5 的子集更新,因此也基于 .NET 4.5 程序集引用,但有一些细微差别(请注意,.NET 自 2.0 版起具有向后兼容性支持)。事实上,该项目将使用 4.6 版本的程序集引用进行编译,但当更高版本的不可用时,可以在目标机器上使用 4.5 版本的运行时引用。
  • 您指的是“向后兼容性”。然而,它的定义意味着:期望较低版本的事物将在较高版本的上下文中无缝运行。 (因为更高版本是向后兼容的”不是相反。
  • 在 msdn 找到了可以解释的好文章。 blogs.msdn.microsoft.com/webdev/2012/11/19/…
  • 这个答案看起来很错误,回答者把它放回了前面;因此,如果我使用 4.6 中的功能并使用它进行编译,当我部署到目标服务器(4.5)时,应用程序应该会失败,因为旧版本中不存在所述功能。
【解决方案2】:

据我了解,&lt;compilation debug="true" targetFramework="4.6" /&gt;&lt;httpRuntime targetFramework="4.5" /&gt; 压制,因为httpRuntime 被翻译为以下内容

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

所以上述设置可能是由于一些误解或错误,如果由 VS 直接完成,我不相信这是真的。

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

.NET 框架(包括 ASP.NET)力求保持接近 100% 在机器上更新现有框架时的兼容性。我们 尽量确保如果开发了应用程序 并针对 .NET Framework 4 进行部署,它将继续工作 在 4.5 上。这通常意味着保持古怪、错误或不受欢迎 版本之间的产品行为,因为修复它们可能 对依赖这些行为的应用程序产生负面影响。

【讨论】:

  • 在博文中,它建议在 web.config 中明确设置的任何设置都不会被 httpRuntime 设置所暗示的内容覆盖:“即使 通常意味着 ,运行时会注意到您已经明确设置了 controlRenderingCompatibilityVersion 并且会尊重您的设置。"
  • 仅供参考,如果设置了编译但没有设置httpRuntime,machinekey和pages设置不会有4.5的默认值,需要手动设置。在尝试在旧网站与 .net 核心网站之间共享 cookie 时,这一点非常重要。
  • 如果 Compilation 和 HttpRuntime 都缺少 targetFramework 的解释是什么?
  • 请通过 google 确认,但我认为这些属性用于将应用程序和框架的范围限制为特定版本,但是如果未指定,它可能会假设没有限制并尝试运行任何内容安装的最新版本。尽管假设您可能有一些应用程序在旧版本中运行,这可能不是一个好主意,例如4.0 当您安装另一个可能正在使用最新框架功能的应用程序时,例如4.7.2.
  • @Jarvan: 如果 httpRuntime targetFramework 没有设置,默认值为 4.0
猜你喜欢
  • 2013-02-14
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 2020-05-03
相关资源
最近更新 更多