【问题标题】:Should I precompile ASP.NET 2.0 sites before deployment or not?我是否应该在部署之前预编译 ASP.NET 2.0 站点?
【发布时间】:2009-06-15 15:18:25
【问题描述】:

在我工作的地方,我们做了大量非常小的 ASP.NET 应用程序,并且发生过几次以预编译格式部署站点的情况,需要更改应用程序,但是代码的版本源代码管理中的可用已过时,并且开发人员不可用。该应用程序的 dll 必须被反编译并重新破解。

理想情况下,开发人员通过测试和生产匆忙进行更改并跳过检查更改的情况永远不会发生,我们已经对我们的政策进行了更改以防止这种情况发生,但我想知道编译网站的开销是否每当应用程序池重新启动时服务器上的问题已经足够大,我们应该避免将代码直接上传到服务器。如果我们可以下载实时源代码,则更容易检查源代码控制中的版本与实际的实时版本。

预编译VS将cs文件直接上传到服务器并在那里编译有什么好处?

【问题讨论】:

  • 如果您让开发人员直接更改生产代码,绕过源代码控制和您的标准发布流程,那么您面临的问题远比担心预编译要大。
  • 同意,但我正在尽我所能进行改进。有我无法解决的更大的组织问题没有理由不去打扰我在我的层面上可以影响的事情。

标签: asp.net deployment .net-2.0


【解决方案1】:

我不同意对这一点给出的大多数答案。与临时发布文件相比,预编译有许多优势,其中最重要的是生产和测试环境中的代码或多或少保持同步。预编译可以确保您测试的代码是每次都会投入生产的代码。

您遇到的问题不是预编译与首次运行编译的问题。相反,它源于您使用的源代码控制类型。如果我不得不猜测(我确实猜到了),我会说您正在运行 Visual SourceSafe。如果您要切换到使分支和合并变得微不足道的源代码控制系统,那么您可以将您的代码分成stabledevelopment 分支。错误修复发生在 dev 分支上(一旦验证,这些分支就会合并回 stable 分支)。这样一来,未经测试或其他尚未准备就绪的代码不会出现在生产服务器上,并且您始终拥有stable 的副本以供使用。

【讨论】:

  • 谢谢,罗伯。我认为这是一个很好的对立点,而且非常有用。这看起来确实是个不错的过程,而且我们这里的整个系统都是临时的。您是正确的,我们在这里使用 SS,我希望使用更好的东西。
【解决方案2】:

从纯粹的易用性的角度来看,我确实喜欢简单地将源文件上传到服务器而忘记预编译。

这就是我为我管理的所有网站所做的,甚至是大型网站。我确实尝试养成使用应用程序中更重要部分的习惯,以确保一切正常(并在我使用时编译它们)。

还有一个想法。如果该站点是公开的,您可以让w3c link checker 放开它。这将产生编译它命中的每个页面的效果。无论如何,确保您没有任何损坏的链接是一件好事。

简单地说,我想这些例行检查几乎可以消除用户首次访问编译速度慢的问题。而且由于无论如何这是一个很好的例行程序,所以对我来说效果很好。

【讨论】:

  • 谢谢,史蒂夫。每个页面都是单独编译的吗?似乎性能损失全部来自第一个请求。
  • aspx 文件是单独编译的。在典型配置中,代码隐藏不是因为它们被滚动到 DLL 中。
【解决方案3】:

首先想到的是:

  1. 商业秘密问题
  2. 安全问题
  3. 邋遢的 Joe Moe(懒惰、粗心和可怜的开发者)
  4. Ad Hoc 破解失控的代码。

    • 预编译代码以托管格式在 .Net Framework 上安全高效地运行。
    • 未编译代码是由新手部署的,他们没有花时间考虑与不安全代码相关的许多问题,这些问题对最终用户来说运行效率较低。

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

免责声明:这些 cmets 是“按原样”声明的,如果您对我进行拼写检查,我不在乎。

此致,

Funkie 博士

糟糕的拼写器,但该死的优秀开发者。 :)

【讨论】:

    【解决方案4】:

    这取决于应用程序的大小和使用频率。如果它的使用足够频繁,以至于应用程序池仅在一天结束时才被回收,那么在早上首次启动时稍等片刻可能是值得的。如果它每 30 分钟只被命中一次,每次都强制重新编译,那么可能值得预编译。

    当然,如果它是一个非常大的应用程序,在第一次运行时需要一些时间来编译,我倾向于预编译,尤其是在它没有得到经常使用的情况下。

    【讨论】:

    • 我在本地 Intranet 上有许多 ASP.net 应用程序。所有这些都部署为源代码。其中一些很少使用。但是在第一次编译之后,它们似乎总是很快出现。您是否有任何关于 30 分钟缓存超时的信息来源?我的经验似乎表明并非如此。
    • 应用程序池在 20 分钟后被回收,所以在这之后点击它意味着你得到了启动/编译命中
    • 应用程序不是很大,实际上只有几个页面和程序集。我试图访问服务器上未预编译和刚刚部署的一些内容。访问这些文件所花费的时间很明显(我一直在寻找它),但还不错。他们中的大多数人也没有看到很多访问权限。
    • 30 分钟只是一个例子。我不知道默认的缓存超时是什么。我注意到在我们的环境中,它似乎在那个球场上。
    【解决方案5】:

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

    【讨论】:

    • 其实,Ishtar,用 Reflector 反编译一个 .NET 程序集几乎是微不足道的。由于网络服务器不提供应该在 ASP.NET 中保护的文件,例如 .cs 文件和您的网络配置,这真的是一个很大的优势吗?我同意性能是最受关注的问题。感谢您的回答。
    • 每个程序都可以被反编译。但是读起来“更难”。如果你发布了未编译的项目,任何人都可以直接阅读修改你的代码。
    • 我不确定这两种说法是否完全正确。
    【解决方案6】:

    我在没有预编译的情况下上传文件: 这样,由于我的代码有很多错误,我可以直接从服务器用 Notepad++ 更正它

    另外,Visual Web Developer 2008(免费版)没有编译选项:-P

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多