【问题标题】:ASP.net C# requires IIS restart when new DLL copied to BIN directory将新 DLL 复制到 BIN 目录时,ASP.net C# 需要重新启动 IIS
【发布时间】:2011-06-01 05:26:44
【问题描述】:

我们收到一个问题,每次我们将 dll 复制到 bin 目录时,我们网站上的主域都会停止,唯一的恢复方法是重新启动“WWW Publishing Service”。

我们运行的网站包含许多在单个服务器上运行的 IIS 应用程序,其中每个应用程序都配置为在不同的应用程序池上运行。

我们有一个庞大的代码库,其中包含整个网站的 280 多个 aspx 页面。我们的主域包含大约 100 个 aspx 页面,而子域每个包含 15 或 20 个。

当我们进行构建时,我们当前正在生成一堆 dll,我们手动将它们复制到生产服务器的 bin 目录中。一旦我们这样做了,IIS 显然就会开始循环编译每个 aspx 页面和代码。在这一点上,网站基本上停止了(有时需要重新启动 - 通过重新启动网络发布服务 - 再次唤醒它)。

奇怪的是,这只发生在我们部署到主域 IIS 应用程序时,即 www.如果我们以相同的方式将 bin 文件部署到子域,它几乎可以立即工作。

即使我执行 iisreset.exe,这似乎也无法解决问题。

几个问题:

  1. 是否有任何方法可以加快当前进程以便我们不必重新启动服务器?
  2. 是否有任何明显的代码更改或更新会导致需要重新启动服务(有时我们会运行 iisreset,但这似乎并没有让它恢复活力)?

一些规格:

  • 代码编写为:C#
  • .net 框架:2.0
  • 服务器:Windows Web Server 2008
  • iis 版本:IIS7
  • 数据库:MSSQL 2008 标准

我们将不胜感激。提前致谢。

【问题讨论】:

    标签: c# iis iis-7 windows-server-2008


    【解决方案1】:

    当您将app_offline.htm 文件放在主域的 wwwroot 中时,IIS 站点会脱机。这是 Scott Gu 描述的 IIS 的默认行为。当你这样做时,所有的 dll 都可以被安全地覆盖。当您删除 app_offline.htm 文件时,您的应用程序将在下次请求时启动。

    阅读更多关于app_offline.htmherehere的信息。

    基本上,如果您将具有此名称的文件放在 Web 应用程序目录的根目录中,ASP.NET 2.0 将关闭应用程序,从服务器卸载应用程序域,并停止处理任何新的传入请求应用。然后,ASP.NET 还将通过发回 app_offline.htm 文件的内容来响应应用程序中对动态页面的所有请求(例如:您可能想要“站点正在建设”或“停机维护”消息) .

    这提供了一种方便的方式来在您进行重大更改或复制大量新页面功能时关闭您的应用程序(并且您希望避免人们在内容更新过程中点击和激活您的网站的烦人问题)。它也是一种立即解锁和卸载 .mdf 或 .mdb 数据文件位于 /app_data 目录中的 SQL Express 或 Access 数据库的有用方法。

    一旦删除 app_offline.htm 文件,应用程序的下一个请求将导致 ASP.NET 再次加载应用程序和应用程序域,并且生活将照常继续。

    【讨论】:

    • 那么主要问题是由于 ddls 的锁没有被释放造成的 - 因此我们无论如何都需要重新启动服务才能恢复服务器?
    • 这可能是问题所在。但是在 IIS 中更新 Web 应用程序的正确方法是首先将 app_offline.htm 放在根目录中,然后更新站点以避免锁定和其他类似问题。使用 app_offline.htm 时不需要 iisreset。当您将 vs2010 与 tfs2010 一起使用并获取最新版本时,vs2010 还会在您的根目录中放置一个 app_offline.htm 并在检索到所有文件时将其删除,请参阅有关 stackoverflow.com/questions/3965346/… 的这个问题。
    • 感谢您的帮助。我仍然想弄清楚为什么它需要重新启动以及问题的可能原因 - 但是您的建议确实提高了可用性。
    【解决方案2】:

    据我所知,当您将 dll 添加到 bin 文件夹时,不需要执行 iisreset。 dll 应该会从 bin 中自动加载。

    当你将一个新的 dll 添加到全局程序集缓存时,你应该做 iisreset。

    【讨论】:

    • 这是一个选项,但在你的根目录中设置 app_offline.htm 然后复制 dll 会更安全,这样你的 dll 上所有可能存在的锁也会被释放
    • iisreset 不会在托管多个站点的服务器上运行,而您只更改了一个站点。
    • @JesseBuchanan 通常,如果 iisreset 无法运行,目标应用程序池可能会回收
    【解决方案3】:

    您可以在复制 dll 时在 IIS 中停止该网站,然后重新启动它吗?因为它不会停止托管在同一 IIS 中的其他网站。

    【讨论】:

    • 我们尝试了几次,但没有帮助。无论如何,它不一定能实现我们正在寻找的东西(即解释为什么部署到 www 需要重新启动,而子域需要几秒钟才能回收)
    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多