我应该在部署之前预编译ASP.NET 2.0站点吗?

11

我工作的地方,我们做了很多小型ASP.NET应用程序。有时,网站以预编译格式部署,但应用程序需要更改,而源代码控制中可用的版本已经过时,开发人员也不在场。这时,必须对应用程序的dll进行反编译并重新组合。

理想情况下,开发人员不会匆忙通过测试和生产环境,并跳过检入更改;之后我们已经对策略进行了更改,以避免此类情况发生。但我想知道,每次应用程序池重启时在服务器上编译站点的开销是否足够大,使我们应该避免直接上传代码到服务器。如果我们可以下载实际的现场源代码,那么比较源代码控制中的版本与实际现场版本将更容易。

预编译与将cs文件直接上传到服务器并在服务器上编译它们的优势是什么?


9
如果你的开发人员直接更改生产代码而绕过源代码控制和标准发布流程,那么你面临的问题比担心预编译要严重得多。 - ahockley
3
同意,但我正在尽力改进自己能够影响到的事情。即使在组织层面有着无法解决的大问题,也不能因此而忽略我可以改善的事情。 - NetHawk
6个回答

8
我不同意到目前为止给出的大多数答案。 预编译与临时发布文件相比有许多优点,其中最重要的是生产和测试环境中的代码保持基本同步。 预编译确保您测试的代码每次都是要进入生产环境的代码。
你遇到的问题不是预编译与首次运行编译的区别。而是源代码控制类型导致的。如果我必须猜测(我必须这么做),我会说你正在使用 Visual SourceSafe。如果您切换到使分支和合并变得轻松的源代码控制系统,那么您可以将代码分成“稳定”和“开发”分支。错误修正针对“dev”分支进行(然后在经过验证后合并回“stable”分支)。这样,未经测试或未准备好使用的代码不会出现在生产服务器上,您始终拥有一个“稳定”集以供使用。

谢谢,Rob。我会投票支持这个好的对立面,绝对有用。 这似乎是一个很好的流程,我们整个系统都非常临时抱佛脚。你说得对,我们在这里使用SS,我很想使用更好的东西。 - NetHawk

1

首先想到的是:

  1. 商业机密问题
  2. 安全问题
  3. Sloppy Joe Moe(懒惰、粗心和可怜的开发者)
  4. Ad Hoc Hacking the Code that's out of control.

    • 预编译代码以受控格式在 .Net Framework 上安全高效地运行。
    • 未编译代码由新手部署,他们没有考虑与不安全代码相关的许多问题,这会导致最终用户的效率大大降低。

最终用户利益相关者,是开发人员受托责任的对象。 开发人员应该利用一切机会来提高其产品的效率。

免责声明:这些评论是“按原样”陈述的,我不在乎你是否对我的拼写进行了检查。

真诚地,

DrFunkie

拼写不好,但是非常优秀的开发者。 :)


1

从使用方便的角度来看,我喜欢简单地将源文件上传到服务器上,然后忘记预编译。

对于我管理的所有网站,甚至是大型网站,我都会这样做。我试图养成习惯,检查应用程序的更重要的部分,以确保一切正常(并在此期间进行编译)。

还有一个想法。如果网站是公开的,你可以让w3c链接检查器自由运行。这将使它访问的每个页面都被编译。这也是一件好事,可以确保您没有任何破损的链接。

简而言之,我认为这些例行检查几乎消除了用户首次访问时缓慢编译的问题。既然这是一个好的例行程序,它对我也很有效。


谢谢,史蒂夫。每个页面都是单独编译的吗?看起来性能损失都出现在第一次请求上。 - NetHawk
aspx文件是单独编译的。在典型的配置中,代码后置文件不会被编译,因为它们被合并到DLL中。 - Steve Wortham

0
这将取决于应用程序的大小和使用频率。如果它被经常使用,以至于应用程序池仅在一天结束时被重新启动,那么在早上首次启动时稍等一下可能是值得的。如果它只会每30分钟被访问一次,并且每次都会强制重新编译,那么预编译可能是值得的。
当然,如果它是一个非常大的应用程序,在第一次运行时需要花费一些时间来编译,我会倾向于预编译,特别是如果它没有持续不断地使用。

1
我在本地Intranet上有许多ASP.net应用程序。它们全部都是以源代码形式部署的。其中一些很少使用。但是,在第一次编译之后,它们似乎总是非常快速地启动。你对30分钟缓存超时的信息有任何来源吗?我的经验似乎表明情况并非如此。 - recursive
应用程序池在20分钟后被回收,所以在那之后立即访问会导致启动/编译延迟。 - Sander Rijken
这些应用程序并不是很大,实际上只有几个页面和程序集。我尝试访问一些未预编译且仅部署的服务器上的应用程序。访问这些应用程序所需的时间是明显的(我正在寻找它),但并不那么糟糕。其中大多数也没有太多的访问量。 - NetHawk
30分钟只是一个例子。我不知道默认的缓存超时时间是多少,但我注意到在我们的环境中,它似乎在那个范围内。 - atfergs

0
主要优点在于Web服务器上的编译性能。此外,它可以保护您的代码,因为从汇编中读取代码更加困难 :-)

2
其实,Ishtar,使用Reflector反编译.NET程序集几乎是微不足道的。由于web服务器不会服务应该在ASP.NET中受到保护的文件(如.cs文件和Web.config),所以这真的是一个很大的优势吗?我同意性能是最受关注的问题。感谢您的回答。 - NetHawk
每个程序都可以被反编译。但是它的阅读难度会增加。如果你发布了未编译的项目,任何人都可以直接阅读和修改你的代码。 - Jan Remunda
我不确定这两个陈述中的任何一个是否完全正确。 - NetHawk

0
我上传未经预编译的文件: 这样,由于我的代码非常有缺陷,我可以直接从服务器上用Notepad++进行更正。
此外,Visual Web Developer 2008(免费版)没有编译选项 :-P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接