c# - 在没有正在使用的文件干扰的情况下在 IIS7 中重新部署 ASP.NET 站点

标签 c# asp.net iis iis-7

我们目前有一个进程会导致重新部署 ASP.NET 网站。该代码本身就是一个 ASP.NET 应用程序。目前的方法已经行之有效了一段时间,就是简单地遍历一个文件夹中的所有文件,然后将它们复制到 webroot 中的文件之上。

出现的问题是,有时文件最终会被使用,因此无法复制。这在过去是间歇性的,以至于无关紧要,但在我们的一些流量较高的网站上,现在大部分时间都会发生这种情况。

我想知道是否有人对此有我没有想到的解决方法或替代方法。目前我的想法是:

  1. 只需重试每个文件,直到它起作用。这会在短时间内导致错误,但这并不是那么好。
  2. 部署到新文件夹并将 IIS 的 webroot 更新到新文件夹。除了以管理员身份运行应用程序并运行批处理文件之外,我不确定该怎么做,这非常不整洁。

有谁知道最好的方法是什么,或者是否可以在不以具有管理员访问权限的用户身份运行发布应用程序的情况下执行#2(愿意授予它特殊权限,但我宁愿停止缺少管理员)?

编辑
基础设施的澄清......我们在 NLB 中有 2 个 IIS 7 网络服务器,它们在共享 NAS 上运行它们的 webroot(更清楚地说,它们在 NAS 上使用完全相同的 webroot)。我们进行了大量部署,以至于我们无法自动化的任何方法都将不可行。

最佳答案

您需要做的是暂时停止 IIS 处理该应用程序的任何传入请求,这样您就可以复制新文件,然后重新启动它。这将导致您的客户出现短暂的停机时间,但除非您的网站是关键任务,否则这应该不是什么大问题。

ASP.NET 有一个 feature that targets exactly this scenario .基本上,它归结为在您的 Web 应用程序的根目录中临时创建一个名为 App_Offline.htm 的文件。文件存在后,IIS 将为您的应用程序取消工作进程并卸载正在使用的所有文件。复制文件后,您可以删除 App_Offline.htm 文件,IIS 将愉快地再次开始运行。

请注意,当该文件存在时,IIS 将提供其内容作为对您的 web 应用程序的任何请求的响应。所以要小心你放入文件的内容。 :-)

关于c# - 在没有正在使用的文件干扰的情况下在 IIS7 中重新部署 ASP.NET 站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2430951/

相关文章:

c# - UWP - 文本框验证标志

C# 属性 - 在 setter 访问器中添加逻辑

c# - 正则表达式查找 Href 值

c# - 如何在 javascript 中访问 session 对象成员变量后面的 asp.net 代码?

c# - 使用 C# 的 gRPC - "2 UNKNOWN: Stream remove"

c# - 如何在 .NET 4.0 之前将 TimeSpan 格式化为字符串

c# - 在 GET 中将日期时间参数传递给 Web 服务时遇到问题

asp.net - IIS 7.5 中的 Windows 身份验证因信任关系异常而失败

iis - 将防伪 token 部署到负载均衡器后无法解密

css - Windows Server 2008 IIS7 CSS 无法始终如一地工作