1

我需要在维护过程中关闭我的 Web 应用程序,已经经历了很多方法,比如将 app_offline.htm 放在根目录中,禁用运行时或通过服务器手动禁用它,但我需要实现的是完全自动化地完成这个过程.

我所拥有的是关闭和标记那些日子的开始和结束日期,即是否需要在这些日期关闭应用程序。

我已经拥有的解决方案是在 sql server 代理中创建一个作业,该作业在根目录中创建和删除 app_offline.htm 文件,但问题是我需要为我的应用程序的根目录提供静态路径,我没有不想做。

4

3 回答 3

1

您可以使用appcmd命令行实用程序来管理 IIS 上的站点。它位于%systemroot%\system32\inetsrv\APPCMD. 我认为它仅在 IIS v7 及更高版本中可用,但不确定您是否使用旧版本的 IIS。

要停止和启动站点,命令将如下所示:

%systemroot%\system32\inetsrv\APPCMD stop site <Your Site's Name>

%systemroot%\system32\inetsrv\APPCMD start site <Your Site's Name>

有关 appcmd 实用程序的更多信息在这里:http ://www.iis.net/learn/get-started/getting-started-with-iis/getting-started-with-appcmdexe

于 2013-06-04T19:35:10.877 回答
1

这是处理探测 IIS 以获取物理路径的答案的一部分。它可能需要一些调整

         //eg of site = 'Default Web Site'
        //eg of Application = 'MySite'
        var appName = "MySite";
        //Initializes a new instance of the ServerManager class by using the default path of the ApplicationHost.config file.
        ServerManager mgr = new ServerManager();
        var applications = mgr.Sites.Cast<Site>().SelectMany(s => s.Applications);

        var app = applications.SingleOrDefault(a => a.Path.Equals("/" + appName));

        IList<string> physicalPaths = app.VirtualDirectories.Cast<VirtualDirectory>().Select(v => v.PhysicalPath).ToList();

        //Calling dispose manually. Per MSDN, cannot wrap the ServerManager instance in 'Using' as it causes memory leaks
        mgr.Dispose();

        //Releasing the reference to the Server Manager, per MSDN guidance
        mgr = null;
        return physicalPaths;
于 2013-06-04T20:08:13.723 回答
0

您在这里遇到的一个问题是 Web 应用程序基于请求工作。您提出请求,请求将被处理并返回。因此,依靠这个原则来关闭你的应用程序是行不通的。您需要的是注册某种类型的调度程序,该调度程序Application_Start将根据数据库中的值进行自我配置。虽然我不确定哪种调度机制合适,但您可能想查看Timer(但由于垃圾收集,您必须保留对 this 对象的引用)或System.Threading.Tasks 命名空间中的任务调度程序。

我可能对课程的选择有误,但这可能是一个起点。

现在,至于你的设计决定,我会完全避免它。如果您的 Web 应用程序可以创建app_offline.html或将文件重命名为该文件,则您无法在不通过删除文件手动干预的情况下使服务器重新联机。相反,为什么不创建一些可以查询数据库并脱机并再次联机的维护 Windows 服务?如果您不关心使 Web 应用程序自动联机,那么您不应该关心使其自动脱机。

要考虑的另一件事是配置应用程序脱机时间时的人为错误。错误配置的时间可能会过早或过早地导致您的应用程序崩溃。如果您创建了一些可以关闭和恢复 Web 应用程序的批处理脚本或 PowerShell 脚本,这不是更容易吗?使用 PowerShell 脚本,您可以在 IIS 中查询您的应用程序,而无需指定任何物理位置。

于 2013-06-04T19:50:32.683 回答