发布期间的自定义 app_offline.htm 文件

Posted

技术标签:

【中文标题】发布期间的自定义 app_offline.htm 文件【英文标题】:Custom app_offline.htm file during publish 【发布时间】:2010-05-17 00:33:37 【问题描述】:

当我发布我的 ASP.NET MVC 应用程序时,它会生成一个 app_offline.htm 文件以在更新网站时使网站脱机,然后在发布成功后删除该文件。

这很酷,我真的很喜欢这个想法,但我想创建我自己的发布操作知道的自定义 app_offline.htm 文件,并将其放在不会影响我的开发站点的地方 - 即它不会不要坐在我的开发站点的根目录中,使其始终处于离线状态。

编辑:从Scott Gu's post about app_offline.htm 上的 cmets 来看,似乎 VS 2005 无法自定义 app_offline.htm 文件 - 这在 VS 2008 和现在的 VS 2010 中是否发生了变化?

【问题讨论】:

“来自 Scott Gu 关于 app_offline.htm 的帖子中的 cmets”没有按预期链接,因为我在页面上没有看到任何相关内容。 不知道为什么它没有链接,但是如果您查看 Scott Gu 于 2006 年 12 月 1 日星期五上午 12:56 回复 Rich 的评论 - 您看看我在说什么。 我很想知道这个问题的答案,我想做同样的事情。微软似乎很容易在未来的版本中实现它,而且它实际上会超级方便和实用。 【参考方案1】:

我知道这很旧,但由于我在查看这里后找到了解决方案,所以我认为我应该提供一个答案。 VS 11 将发布的app_offline.htm 文件保存在此位置:

C:\Users\[user]\AppData\Roaming\Microsoft\VisualStudio\11.0\app_offline.htm

我已经对此进行了测试并对其进行了自定义,如果您更改此文件,它确实可以工作。当然,缺点是这是用于所有网络发布的文件。

【讨论】:

+1 感谢您的回答...这不是一个理想的解决方案,但暂时适合许多人。我只是希望 Visual Studio 团队能够构建一些东西,这对我来说似乎是一个不错的功能:-) 不幸的是,我刚刚发现 VS 决定在一段时间后覆盖它。我同意,最好有一个可定制的解决方案 @Eonasdan 你知道是什么导致了覆盖吗?可能更新到VS? 我刚刚在我的本地计算机上将 C:\users[user]\AppData\...\app_offline.htm 更改为只读,它似乎一直在等待。 VS2013 似乎完全忽略了这个文件【参考方案2】:

许多人可能会认为合适的简单解决方案是简单地将您自己的文件(也称为 "app_offline.htm")添加到您的解决方案中。

我已经使用 Visual Studio 2015 测试过这种方法,它确实有效。

但是,唯一的缺点是在发布过程中,默认生成的app_offline.htm 文件会被复制首先,然后是解决方案文件(似乎按/接近字母顺序)。 p>

这意味着您的自定义app_offline.htm 文件会快速(但不是立即)覆盖系统生成的文件。因此,系统生成的(丑陋的)app_offline.htm 副本可能会在启动发布的 1-2 秒窗口内提供给请求,然后再使用您的自定义文件进行更新。

发布过程会自动从远程服务器中删除app_offline.htm,无论其内容或来源如何。

优点是(相对于替换系统副本)是您自己的副本是可移植的,自动特定于解决方案,并且可以与源代码控制一起使用。

我知道这个问题很老,但我希望这有助于其他人应对这个问题。

【讨论】:

有趣,一定要试一试。谢谢你这么久的回答。 +1【参考方案3】:

我用自己的

app_offline.htm_

解决方案中的文件,该文件已发布。然后我的部署脚本将其重命名(删除尾随的 _)以使其处于活动状态。

然后我可以运行我的数据库脚本/执行任何操作,然后重命名文件以恢复站点。

【讨论】:

您的部署脚本如何删除尾部斜杠?最后一步重命名文件是手动操作吗? 我只是像往常一样制作 app_offline.htm(简单的 html/css)并将其添加到我的项目中(但称为 .htm_,因此在调试时它不会使我的开发站点脱机)。确保将构建类型设置为内容。我发布并上传代码,然后我有一个复制代码的部署脚本,并将app_offline.htm_ 重命名为app_offline.htm。简单 部署脚本完成后是否删除文件? 不,我把它留在那里,所以当我推出新代码时,我可以重新打开它 @AndrewBullock 为什么不发布你的代码,而是用文字解释一切???【参考方案4】:

Andrew Bullock 的回答很有魅力!虽然这取决于您使用的是哪个视觉工作室。

C:\Users\USERNAME\AppData\Roaming\Microsoft\VisualStudio

是你应该首先登陆的目录,选择你的VS版本[8.0/9.0.....]并编辑app_offile.htm文件。

【讨论】:

【参考方案5】:

app_offline.htm 的原始内容确实存储在一个神秘的位置(可能在其中一个二进制文件中硬编码),但是 Visual Studio 确实在上传之前将内容写入物理文件。

如果您至少发布过一次,使用dir C:\app_offline.htm /s/a/b 在命令提示符中进行简单搜索应该会找到写入临时文件的位置。它应该类似于C:\Users\username\AppData\Roaming\Microsoft\VisualStudio\16.0_5fc0d832\app_offline.htm。我不确定最后的十六进制字符串是否对于每个安装或用户都相同。

将该文件设置为只读确实可以防止 Visual Studio 覆盖其内容,而且对该文件的修改实际上会在发布期间上传。但是,它会导致内部错误,最终可能会阻止它随着时间的推移上传。

app_offline.htm 是在构建后事件之前写入的,因此只需在 Visual Studio 开始上传之前将其覆盖。

更具弹性的方法是执行以下操作:

1) 在您的项目中创建自定义app_offline.htm(不在项目的根文件夹中,它会阻止您使用 F5 开始调试。)

2) 使用 post-build 事件将自定义 app_offline.htm 从项目文件夹复制到 Visual Studio 的暂存文件夹。

构建后事件命令行:

copy /y "$(ProjectDir)Resources\app_offline.htm" 
"C:\Users\%username%\AppData\Roaming\Microsoft\VisualStudio\16.0_5fc0d832\app_offline.htm"

【讨论】:

我认为,对于想要自动化自定义应用离线部署而不是手动操作任何东西的人来说,这个解决方案似乎是最好的解决方案。【参考方案6】:

您可以使用一个批处理文件,它以当前目录信息作为参数调用编译器...然后复制 app_offline.htm 并复制新文件。从源头运行它。

我个人使用的程序比批处理稍微复杂一些,还检查文件的哈希以确定是否需要更新创建新文件的 zip 并将其提取到远程主机并消除我们指定的文件从测试到生产时的单元测试。我还将 SVN 集成结合到我的解决方案中,因此当您发布测试或生产时,您还可以选择提交到 SVN。该程序存储在网络驱动器上,并使用当前目录信息从本地 PC 上的批处理文件中调用。这样,如果发生任何更改,开发人员就不必更新到新的部署程序或 app_offline。最后,它删除了 app_offline。

查看http://msdn.microsoft.com/en-us/library/system.web.compilation(v=vs.80).aspx 了解更多信息,或者查看http://msdn.microsoft.com/en-us/library/ms229863(v=vs.80).aspx 如果您只是快速批量生产!

此外,在您最初引用的帖子中,我还验证了您实际上可以更改它,但您也可以使用发布功能为其他人更改它。这就是为什么你得到了你的答案。

【讨论】:

【参考方案7】:

对于 Visual Studio Express 2013 for Web 的用户,该文件位于 C:\Users[user]\AppData\Roaming\Microsoft\VWDExpress\12.0

可以根据您的需要进行修改。

【讨论】:

【参考方案8】:

早在 2006 年,Scott Gu 就表示无法自定义 VS 在 Publish 上生成的文件。

Comment within original article

我也有兴趣解决这个问题,但我无法在 Google 上找到任何相反的明确结果。

【讨论】:

【参考方案9】:

你见过吗?

App_Offline.htm

它可能不是(完全)你想要的,但它确实解决了我认为的问题。

【讨论】:

以上是关于发布期间的自定义 app_offline.htm 文件的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 中的app_offline.htm的使用

有没有办法让图像通过 ASP.NET 和 app_offline.htm 显示?

App_Offline.htm 问题解决

经典 ASP 应用程序的 App_Offline

网站“停机维护”最佳实践

Gitlab 中是不是存在技术可能性,即在合并期间存储库内容的自定义改编是 Dome?