发布期间新的预编译选项对MVC4应用程序有什么影响?


85

因此,我最近将Visual Studio 2012更新为Update2。瞧瞧,下次我去发布应用程序(在这种情况下通过File Publish)时,我注意到有三个新选项:

  1. 在发布之前删除所有现有文件
  2. 发布期间进行预编译(带有指向Configure的链接)
  3. 从App_Data文件夹中排除文件

第一个和第三个选项很容易解释,但是我找不到关于第二个选项的任何文档,因为它适用于MVC。当我检查它时,该站点上生成的文件似乎没有任何变化,并且我看不到性能的任何实际变化。


函数的位置可能是新的,但函数本身不是。即使考虑编译MVC,WebForm也可以在MVC项目中互操作。
Grant Thomas

Answers:


84

使用ASP.NET预编译器会对您的MVC应用产生以下影响:

  • 如果App_Code中包含任何内容,则将在部署前将其预编译为DLL。如果不进行预编译,则ASP.NET运行时会即时发生这种情况。
  • 如果您选择使页面可更新的选项(即取消选中高级设置对话框中的第一个复选框),它还将预编译视图(ASPX和Razor),而不是在运行时动态编译视图。默认(选中)设置为“允许预编译的站点可更新”,使您可以更新视图内容,而无需重建整个项目。

如果您在App_Code中没有任何文件,并且希望您的站点保持可更新状态,那么它似乎没有什么作用。


7
@Elsimer您的.cshtml文件仍然存在,但是如果对其内容进行了预编译,您将发现其内容替换为“这是由预编译工具生成的标记文件,不应删除!”。
吉米

4
此外,当为每个页面动态调用编译器时,性能提升主要来自初始站点启动。一旦页面被命中一次(并编译),即使您尚未预编译,该编译结果也将用于后续页面加载。
Jimmy

15
无需更新页面的另一个好处是,VS会在视图中发现类型错误,然后再将其添加到活动站点。
克里斯,

4
@Chris,如果不使用precompile选项不会捕获此类错误,则应重新考虑测试策略。
user247702 2014年

2
@AndersLindén:只需测试控制器动作的实际渲染响应即可。这将调用Razor,并且如果它生成异常,则将使您的测试失败。但是,这也是为什么您的视图对代码的了解应该很少的原因。您实际上无法像对类一样对视图代码进行细粒度的单元测试。它几乎只是通过或失败,即使这样,通过也只是意味着它没有生成任何异常,并不是说它实际上按照预期的那样运行。
克里斯·普拉特

0

这是一个古老的问题,但是我遇到类似的问题,觉得值得分享。

我的错误信息在这篇文章中是相同的。我的项目是MVC5,使用Visual Studio 2013 Professional构建。 编译错误:两个DLL中都存在类型'ASP.global_asax'

在我的情况下,使用precompile选项,bin文件夹中有一个文件App_global.asax.dll,并导致上述错误消息。首先,我在服务器上删除App_global.asax.dll,重新启动应用程序池,问题消失了。然后我尝试了另一种方法,取消选中预编译并重新发布,重新部署到服务器,问题消失了。

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.