25

我已经使用默认的“允许此预编译站点可更新”多次构建了一个网站,但是在最近的编译中,该网站非常损坏。在玩弄了 .dll(在 bin 中删除和替换它们)之后,我注意到网站的某些部分又开始工作了,但是如果我将所有原始 .dll 放在网站中,就会损坏。

我正在使用带有几个 Ajax Web 扩展的 aspx 页面。这些是最近添加的,可能是问题的根源。我取消选中“允许此预编译站点可更新”,它在 bin 中添加了各种额外编译的代码文件,网站的所有问题都消失了……这是怎么回事?有什么区别?

我更新网站的方式似乎也没有任何区别,只是每次都从 Visual Studio 直接发布。

任何见解将不胜感激。

4

2 回答 2

23

取消选中“允许此预编译站点可更新”会编译 .Aspx 页面,而不仅仅是代码文件 (.VB/.CS)。选中它允许您在部署 .Aspx 文件后对其进行某些更改而无需重新编译(例如 = 移动控件的位置或添加一些额外的 HTML 标记)。

在阅读了您对部署问题的描述后,错误似乎更有可能是因为 IIS 需要刷新应用程序池。在低端 VPS 上,如果您有这种奢侈,有时反弹(重新启动)它是有意义的。

有关站点预编译的更多信息,请阅读以下 MSDN 文章。

http://msdn.microsoft.com/en-us/library/399f057w(v=vs.80).aspx

http://msdn.microsoft.com/en-us/library/ms247286(v=vs.80).aspx

于 2012-08-15T20:31:09.097 回答
7

根据 NoAlias 所说,我对自己的问题有一个答案。我阅读了这两个链接,发现以下内容:

仅用于部署的预编译
当您只为部署进行预编译时,编译器会从通常在运行时编译的几乎所有 ASP.NET 源文件生成程序集。这包括页面中的程序代码、.cs 和 .vb 类文件、其他代码文件和资源文件。编译器从输出中删除所有源代码和标记。在生成的布局中,为每个 .aspx 文件(扩展名为 .compiled)生成编译文件,这些文件包含指向该页面的相应程序集的指针。要更改网站,包括页面布局,您必须更改原始文件、重新编译站点并重新部署布局。唯一的例外是站点配置;您可以更改生产服务器上的 Web.config 文件,而无需重新编译站点。

为部署和更新
进行预编译 当您为部署和更新进行预编译时,编译器会从所有源代码(单文件页面中的页面代码除外)和其他通常会生成程序集的文件(例如资源文件)中生成程序集。编译器将 .aspx 文件转换为使用已编译代码隐藏模型的单个文件,并将它们复制到布局中。此选项使您能够在编译站点中的 ASP.NET 网页后对其进行有限的更改。例如,您可以更改控件的排列、颜色、字体和页面的其他外观方面。您也可以添加控件,只要它们不需要事件处理程序或其他代码。当站点第一次运行时,ASP.NET 会执行进一步的编译,以便从标记中创建输出。笔记

预编译的可更新站点不允许多个页面引用同一个 CodeFile 类。

我最近对该站点进行了更改,以包含 2 个引用相同 CodeFile 的 aspx 页面(后台相同的 VB 代码)每个页面的 html 属性略有不同,但需要具有相同的 CodeFiles,所以对于我的第二个 ASP 页面,我删除了自动生成的 VB 代码文件,然后在 HTML 中引用不同的 CodeFile。

如上所述,预编译的可更新站点不允许多个页面引用相同的代码文件类。这就是为什么我的某些页面无法正常工作的原因。

从这一点开始,我需要避免使用默认复选框“允许此预编译站点可更新”;我的网站必须保持未选中状态才能使用引用我的多个页面的 VB 代码文件。

结论:引用同一个 CodeFile 的多个 aspx 页面需要预编译才能正确运行。这意味着如果不重新部署,该站点将无法对其进行任何更改。

于 2012-08-20T14:18:04.830 回答