C# 在IIS7中重新部署ASP.NET站点而不使用文件

C# 在IIS7中重新部署ASP.NET站点而不使用文件,c#,asp.net,iis,iis-7,C#,Asp.net,Iis,Iis 7,我们目前有一个进程导致ASP.NET网站被重新部署。代码本身就是一个ASP.NET应用程序。当前的方法已经工作了相当长一段时间,只需在一个文件夹中的所有文件上循环,然后将它们复制到webroot中文件的顶部 出现的问题是,有时文件会被使用,因此无法复制。这在过去是断断续续的,已经到了无关紧要的地步,但在我们一些流量较高的网站上,这种情况现在大部分时间都在发生 我想知道是否有人有我没有想到的解决方法或替代方法。目前我的想法是: 只需重试每个文件,直到它工作。这将在短时间内导致错误,但这并不是很好

我们目前有一个进程导致ASP.NET网站被重新部署。代码本身就是一个ASP.NET应用程序。当前的方法已经工作了相当长一段时间,只需在一个文件夹中的所有文件上循环,然后将它们复制到webroot中文件的顶部

出现的问题是,有时文件会被使用,因此无法复制。这在过去是断断续续的,已经到了无关紧要的地步,但在我们一些流量较高的网站上,这种情况现在大部分时间都在发生

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

  • 只需重试每个文件,直到它工作。这将在短时间内导致错误,但这并不是很好
  • 部署到新文件夹并将IIS的webroot更新到新文件夹。除了以管理员身份运行应用程序和运行批处理文件之外,我不知道如何做到这一点,这是非常不整洁的
  • 是否有人知道这样做的最佳方式是什么,或者是否有可能不以具有管理员权限的用户身份运行发布应用程序(愿意授予它特殊权限,但我更愿意在没有管理员的情况下停止)

    编辑

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

    在尝试复制文件之前,您还可以尝试修改根文件夹中web.config的时间戳。这将卸载应用程序并释放使用过的文件。

    您需要做的是暂时停止IIS处理该应用程序的任何传入请求,以便您可以复制新文件,然后重新启动它。这会给你的客户带来一个小的停机时间,但除非你的网站是任务关键型的,否则这应该不是一个大问题

    ASP.NET有一个。基本上,它归结为在webapp的根目录中临时创建一个名为App_Offline.htm的文件。一旦文件存在,IIS将关闭应用程序的工作进程并卸载所有正在使用的文件。一旦你复制了你的文件,你就可以删除App_Offline.htm文件,IIS将很高兴地再次开始搅动


    请注意,当该文件存在时,IIS将其内容作为对您的webapp的任何请求的响应。因此,请注意您在文件中输入的内容。:-)

    除非您手动打开web服务器上文件的句柄,否则IIS不会锁定您的文件

    尝试关闭可能锁定您的文件的其他服务。一些共同服务的例子就是这样做的:

    • Windows搜索
    • 谷歌桌面搜索
    • Windows备份
    • 任何其他防病毒或索引软件

    另一个解决方案是IIS编程管理

    然后,您可以将新的/更新的web复制到另一个目录,然后将webapp的IIS根目录切换到该另一个目录。那么,文件是否锁定在原始根目录中就无关紧要了。这是一个很好的网站可用性解决方案

    但是,它需要一些权限调整

    您可以通过ADSI或WMI(适用于IIS 6)或Microsoft.Web.Administration(适用于IIS 7)执行此操作


    关于您的2,请注意WMI不像ADSI那样需要管理员权限。您可以按对象配置权限。检查WMI控制台(mmc)。

    由于您已经在两台web服务器之间进行负载平衡,您可以:

  • 在负载平衡器中,使web服务器A脱机,以便仅使用web服务器B
  • 将更新的站点部署到web服务器A
  • (作为奖励,您可以在web服务器a投入生产之前通过额外的测试。)
  • 在负载平衡器中,将B脱机,将A联机,这样只有web服务器A在使用
  • 将更新的站点部署到web服务器B
  • (作为奖励,您可以在web服务器B投入生产之前对其进行额外的测试。)
  • 在负载平衡器中,将B重新联机。现在,这两个web服务器都已升级并重新投入生产
  • 列表项
  • 我们有相同的服务器(2003年)和相同的问题。某些dll被锁定,并将App_Offline.htm放在网站根目录中

    解决方案:

    文件权限

    我们使用了一个在网络服务帐户或IIS_WPG帐户下运行的web服务来将更新部署到web站点。因此,它需要对所有文件进行写访问。我已经知道了这一点,并且不久前已经设置了目录的权限。但是由于某种奇怪的原因,没有对这个问题dll设置必要的权限。您不仅应该检查目录的权限,还应该检查问题文件的权限


    我们为网络服务和IIS_WPG用户提供了对整个web根目录的读/写访问权限,从而解决了我们的文件正在使用、文件锁定、超时和访问被拒绝的问题。

    复制进程和IIS循环工作进程之间仍然存在竞争条件。所以,是的,它可能会工作,但也可能不会。我本以为如果有新的请求进来,它就更有可能访问文件,因为它必须重新加载所有内容?除非是打赌在下一个请求之前进入,如果是这样的话,我真的不认为这在我所说的网站上是可能的。其中一个运行的API非常频繁,我们在部署堆栈溢出时也经常遇到这种情况;IIS7似乎会对它所服务的一些文件保持暂时锁定,就像基于文件的俄罗斯轮盘赌.Fyjham-您应该在问题中添加一个注意事项,即您有一个web服务器场,其中两台服务器共享来自NAS的代码-因为这将有一个主要的