ASP.NET网站发布与复制的区别?

8
我在发布方面遇到了很多问题,例如当你需要对代码进行小的更改时,有时候生成的DLL文件(例如default.aspx.CS在发布时的dll文件)无法被IIS识别,会显示代码错误或者其他问题。抱歉我不记得具体的错误信息了,但是我希望你能理解我的意思。
因此,我通常使用简单的复制粘贴操作代替发布。
你能告诉我不使用发布方法会错过什么吗?发布方法有何优势?或者你更喜欢哪种方法,为什么?
基本上这是一个利弊得失的情况。
谢谢。

发布也受您选择部署的应用程序类型的影响;Web站点应用程序允许您只发布一些文件,而Web应用程序通常需要将ASPX和适当的DLL部署到正确的文件夹中。阅读https://dev59.com/kHRC5IYBdhLWcg3wJNgN获取更多信息。 - dash
谢谢您的评论。但这对我并没有太大帮助。例如,有没有性能差异?也许可以概括为“进行Web应用程序而不是发布网站”。 - E-A
2个回答

16

嗯,这取决于您所说的“复制”是什么意思:

使用 Publishing,您可以选择编译整个应用程序或部分应用程序。您可以将其 发布 到本地文件夹(而不是目标/主机),然后仅复制更新的文件。如果您正在进行“代码后端”(C# / VB 代码)更改,这意味着您只需要“复制”/覆盖dlls。不言而喻,如果您进行了“内容”更改(HTML/Razor/Script等更改),那么您也需要复制/覆盖这些更改。

如果您是新手部署者,您可能会发现自己只需复制/覆盖“所有内容”,这是最安全的方式。一旦您有了更多的经验,您将会“认识到”哪些资产只需要更新(一个或几个dlls和/或内容代码,而不是“所有内容”)。这没有什么魔法,通常只是看一下您的dll/文件在publish(本地发布)或rebuild您的Web应用程序后的时间戳。

我建议进行local publish,以便您可以看到服务器上实际需要的内容。发布到本地文件系统/文件夹的文件是需要放置在主机/服务器上的。这样做可以可视化并消除Publishing中的任何“神秘”内容:

  • 您将看到实际所需(在您的服务器上)与不需要的内容。
  • 您将看到文件时间戳,这将帮助您识别哪些文件实际上已更改,哪些文件没有更改(因此不需要更新)。
  • 一旦您掌握了它,您将不需要“复制”/ftp“所有内容”,只需更新实际修改的文件即可。

所以,“copy”可以指上文提到的内容,或者如果你说你将简单地复制所有开发代码(原始的(vb/cs)html/cs/vb)到你的主机上,那么这意味着每个资源被需要/请求时,你的站点将会是动态编译的(没有预编译)。这也很“容易”,但你会失去预编译,这意味着在每个 web 页面被请求/需要时都会有一定的延迟(ASP.net 需要动态编译)。此外,你还会在服务器上公开你的源代码。根据你的情况,这可能无关紧要,但这是需要考虑的另一个因素。

这里有更多关于预编译和选项的信息


你的回答非常详细,让我知道你清楚地理解了部署过程。然而,有一件事情我想澄清:我认为知道哪个文件需要更新是很好的,但是当我的团队更新一个网站时,我会更新整个站点,而不仅仅是替换一些DLL文件...这种方法虽然可行,但容易出现人为错误。我更喜欢上传整个经过测试的应用程序到IIS,解压缩它,然后将IIS指向新文件夹。你觉得呢? - Hoàng Long
@HoàngLong 我个人认为,这就像“ftp everything”一样。Ftp everything会更少出现其他问题 - 例如那些新文件夹上的应用程序权限、Web farm/复制问题等。此外,如果您无法直接访问服务器,则该方法似乎只有可能/可行。另一种方法是使用WebDeploy,它可以以“智能方式”为您完成操作(为您找出更改)。如果您可以使用它,那么这是值得研究的东西。 - EdSF
是的,它几乎像“ftp everything”(除了它不会有冗余文件,因为整个Web应用程序文件夹被替换)。WebDeploy似乎是一个有趣的选择...我会试试它。 - Hoàng Long
FYI,我在转向Microsoft技术栈之前更多地了解了Java Web应用程序。在我的旧的“工作方式”中,首选一包部署:整个Web应用程序放入一个WAR文件中,将其放入文件夹中即可完成。WAR文件易于版本控制和跟踪。如果部署后发生错误,可以通过替换WAR文件轻松恢复网站。这只是为我的初学者问题提供一些背景 :) - Hoàng Long
1
@HoàngLong 已经明白 - 任何有效/有意义的方式都可以 :) 过去也做过类似的事情。将网站打包成带版本号的 msi。因此,就像任何软件“更新”(卸载旧版本/安装新版本)一样。如果需要回滚,只需“重新安装”以前的版本即可。 - EdSF

6
假设我们考虑一个aspx页面及其所对应的aspx.cs后台代码文件,有三种部署站点的替代方案:
  1. 您可以将两者复制到IIS上。在第一次请求时,aspx将被编译为.cs,然后这两个.cs文件将被编译为临时.dll文件。
  2. 您可以“发布”到IIS上,这将编译代码后台类为.dll,但将不改变aspx。在第一次请求时,aspx将被转换为.cs,然后再转换为.dll
  3. 您可以“发布”网站,然后使用aspnet_compiler手动进行预编译。发布将像以前一样将代码后台编译为.dll,但是接着预编译将清除.aspx文件并将编译后的代码移动到另一个.dll中,从而消除了任何更改的可能性,并加快了站点的启动速度,因为无需编译资产。对于共享环境非常适用。
这三种模式都有其优缺点。
第一种更新增量最容易,但同时也最容易遭受意外修改。
第二种同样简单,可以从VS调用,它关闭了一些不必要的服务器修改的可能性,但仍需要时间来编译.aspx文件。
第三种需要时间和一些手动操作,但可以防止任何更改,并加速站点的启动,因为无需编译资产。它非常适用于共享环境。

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