试图了解ASP.NET MVC中视图的精细应用程序池刷新和预编译

时间:2014-04-25 15:26:26

标签: asp.net-mvc azure

我正在使用ASP.NET MVC3,.NET4,Razor,C#,EF4.1,MS SQL2008(dev),SQL Azure(测试,实时)。

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

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

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

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

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

  • 项目DLL被复制

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

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

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

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

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

我尝试通过pingback服务将应用程序池保留在内存中,无论是外部监视器站点(Uptime Robot)还是MS的“always on”服务都是相同的。但仍然可以让应用程序池刷新,从而减慢速度。在我看来,所有内容都应该进行预编译以便部署,这样如果从内存中删除,那么重新运行将很快。

我的问题

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

2)我现在应该做些什么来最大限度地提高预编译并最大限度地减少这些应用程序池刷新处罚,从而保持性能达到峰值,即没有开始一天的热身等。我最初的印象是预编译视图。我确实尝试编辑Project XML文件,具体来说就是这个设置:

    <MvcBuildViews>true</MvcBuildViews>

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

  

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

修改

进行了一些研究之后,似乎我需要专注于预编译视图,因为存在两个主要工具:

a) RazorSingleFile
b) RazorGenerator

显然

<MvcBuildViews>true</MvcBuildViews>

只是编译而不是预编译。不确定区别。所以建议使用上面的工具之一。

EDIT2

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

2 个答案:

答案 0 :(得分:1)

建筑景观时有一个严重的兔子洞。有一些已知的错误发生了这个特殊的错误。唯一知道的是使用<BaseIntermediateOutputPath>。这条路径需要存在,而不是在项目路径中(我认为)。我通常使用:

<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,可能有附加组件)。这里有两个不同的问题。

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

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

答案 1 :(得分:1)

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

然后我选择了:

Precompile during Publishing

然后我点击&#34;配置&#34;然后取消选中:

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因为它更大而更糟糕。

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

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