我需要在维护过程中关闭我的Web应用程序,已经经历了很多方法,例如将app_offline.htm放在根目录中,禁用运行时或通过服务器手动禁用它,但我需要实现的是执行此操作过程完全自动化。
我所拥有的是那些日子的关闭和标志的开始和结束日期,即是否需要在这些日期关闭申请。
我已经拥有的解决方案是在sql server agent中创建一个作业,该作业在根目录中创建和删除app_offline.htm文件,但问题是我需要为我的应用程序的根目录提供静态路径我不想这样做。
答案 0 :(得分: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
答案 1 :(得分: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;
答案 2 :(得分:0)
您在这里遇到的一个问题是Web应用程序在请求的基础上工作。您发出请求,处理并返回请求。因此,依靠此原则关闭您的应用程序将无法正常工作。您需要的是在Application_Start
中注册某种类型的调度程序,该调度程序将根据数据库中的值进行自我配置。虽然我不确定哪种调度机制是合适的,但您可能希望查看Timer
(但由于垃圾收集而必须保留对此对象的引用)或System.Threading.Tasks namespace中的任务调度程序。
我可能选择了一些课程,但这可能是一个起点。
现在,至于你的设计决定,我会完全避免它。如果您的Web应用程序可以创建 app_offline.html 或将文件重命名为该文件,则无法通过删除文件将服务器重新联机而无需手动干预。而不是为什么不创建一些维护Windows服务,可以查询数据库并脱机并重新联机?如果您不关心自动将Web应用程序联机,那么您不应该关心将其自动脱机。
要考虑的另一件事是配置应用程序脱机时的人为错误。错误配置的时间会过早或过早地降低您的应用程序。如果您创建了一些可以删除并恢复Web应用程序的批处理脚本或PowerShell脚本,会不会更容易?使用PowerShell脚本,您可以在不指定任何物理位置的情况下查询应用程序的IIS。