【问题标题】:Trying to understand the finer details application pool refresh and precompilation of Views in ASP.NET MVC试图了解 ASP.NET MVC 中视图的更精细的应用程序池刷新和预编译细节
【发布时间】:2014-04-25 15:26:25
【问题描述】:

我正在使用 ASP.NET MVC3、.NET4、Razor、C#、EF4.1、MS SQL2008(dev)、SQL Azure(test,live)。

我正在将我的 Web 应用程序部署到“标准”Azure 网站。我的流程是:

1) 发布到本地 IIS 文件夹,未选择预编译选项:

  • 项目 C# 代码编译为项目 dll 并放入“bin”文件夹。

  • 视图保留为源 *.cshtml 文件

2) FTP 使用 Beyond Compare 将文件更改到部署服务器,所以

  • 项目 DLL 被复制

  • 源 *.cs 文件(控制器、助手、模型)被复制。

  • 更改源 *.cshtml 视图被复制

对于部署服务器的初始调用,由于 JIT 编译,响应很慢。我怀疑这是由于:

a) 正在编译的视图。与项目 dll 相对的主要因素??

b) 项目 DLL 已经预编译,所以这里没有问题???这对吗?

我尝试通过 pingback 服务将应用程序池保存在内存中,无论是外部监视器站点(Uptime Robot)还是 MS 的“始终在线”服务,都是一样的。但是仍然可以获得应用程序池刷新,从而减慢速度。在我看来,一切都应该为部署进行预编译,这样如果从内存中删除,那么重新运行会很快。

我的问题

1) 我对什么是预编译和什么不是预编译的理解正确吗?

2) 我现在应该怎么做才能最大限度地提高预编译并最大限度地减少这些应用程序池刷新损失,从而将性能保持在峰值,即没有开始一天的热身等。我最初的印象是预编译视图。我确实尝试过编辑 Project XML 文件,特别是这个设置:

    <MvcBuildViews>true</MvcBuildViews>

但是,当我尝试使用上述设置发布时,出现错误:

obj\release\aspnetcompilemerge\source\web.config(45): error ASPCONFIG: 使用注册为 allowDefinition='MachineToApplication' 的部分超出应用程序级别是错误的。此错误可能是由于虚拟目录未在 IIS 中配置为应用程序所致。

编辑

做了更多研究后,我似乎需要专注于为存在的 2 个主要工具预编译视图:

a) RazorSingleFile
b) RazorGenerator

显然

<MvcBuildViews>true</MvcBuildViews>

只是编译而不是预编译。不确定有什么区别。所以建议使用上述工具之一。

EDIT2

我的主要 MVC 项目 dll 的大小为 890k-ish。这个大吗?大小会导致更多的内存丢失吗?

【问题讨论】:

    标签: asp.net-mvc azure


    【解决方案1】:

    构建视图时存在严重的兔子洞。有一些已知的错误会发生此特定错误。唯一知道的是否是使用&lt;BaseIntermediateOutputPath&gt;。这条路径需要存在,而不是在项目路径中(我认为)。我通常使用:

    <MvcBuildViews>true</MvcBuildViews>
    <BaseIntermediateOutputPath>..\..\tempMVC</BaseIntermediateOutputPath>
    

    The Aspnet Compiler Build Task in Visual Studio 2010 ASP.Net MVC 2 Projects

    我 95% 确信:您 can't pre-compile MVC views(cshtml 等)用于部署(使用任何默认版本的 Visual Studio,可能有附加组件)。这里有两个不同的问题。

    首先,&lt;MvcBuildViews&gt; 在设置为 true 时只是构建时强类型检查器。这意味着如果您针对特定的@model 构建视图,编译器将在构建期间检查视图以确保没有错误地使用模型(例如尝试使用模型上不存在的属性)。

    其次,将视图预编译到程序集中的概念是 Webforms 存在的一个过程,因为前面有代码,后面的代码可以组合。视图不会以这种方式与逻辑绑定,因此编译器并未设计为将 MVC 视图考虑在内。

    【讨论】:

    • 谢谢。会尝试。这与 Razorgenerator 的输出在编译视图和运行时速度方面是否存在差异。
    • 还添加了 EDIT2,与项目 dll 大小有关。基本上890K是不是太大了?
    • 根据您的 cmets 更新。 890K 很小,我说很小,因为 EntityFramework 是 5056k。
    • 感谢您的反馈。不理解有关“您无法为部署预编译 MVC 视图(cshtml 等)”的评论。这不是 RazorGenerater 或 RazorSingleFile 所做的吗?
    • RazorGenerator 和 RazorSingleFile 是附加组件。我是说,开箱即用的 Visual Studio 无法预编译视图。
    【解决方案2】:

    好的,我的解决方案是发布应用程序。

    然后我选择了:

    Precompile during Publishing
    

    然后我点击“配置”,然后取消选中:

    Allow precompiled site to be updateable
    

    然后我选择了:

    Do not merge, create a seperate assembly for each page or control.
    

    这启用了视图的预编译,并将它们放在 bin 文件夹中,格式为:

    _orders.cshtml.4deb95a2.compiled
    

    我理解这是 p 代码,因此在部署服务器上首次加载时仍需要二进制编译。项目 dll 更糟,因为它更大。

    顺便说一句,我确实遇到了很多由旧的排除代码文件引起的程序集引用问题。我想如果排除它们就足够了,但是没有......最后我只是将它们全部删除,并且预编译成功完成。

    这样做迫使我修复了很多隐藏的剃刀错误,这些错误会在运行时而不是编译时出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 2013-02-27
      • 1970-01-01
      • 2016-03-20
      • 2019-01-06
      • 2012-10-04
      相关资源
      最近更新 更多