我已经为此伤透了脑筋。请帮我停止挠头吧。
我们有一个手动解决方法,可以解决我们遇到的一个网站问题。当我们手动执行这些步骤时,解决方法总是有效的,但运行执行相同步骤的脚本有时会有效,但通常不会。我的问题是:为什么手动执行这些步骤和根据脚本执行这些步骤之间会有区别?
手动步骤如下:
- 停止网站
- 在 IIS 管理器中,选择站点,单击停止
- 回收后端服务运行的应用程序池
- 在 IIS 管理器中,选择应用程序池,单击回收
- 调用后端服务上的方法。这是为了在启动网站之前预先填充一些数据。后端服务是一个 .asmx
- 在 Internet Explorer 中,导航到后端的方法调用页面,输入一些参数,单击“调用”
- 启动站点
- 在 IIS 管理器中,选择站点,单击开始
正如我所说,这总是会启动网站并使其具有完整功能。这应该是可以编写脚本的,对吧?
因此我编写了一个批处理脚本,其主要功能如下:
%windir%\system32\inetsrv\appcmd.exe stop site nameOfSite
%windir%\system32\inetsrv\appcmd.exe recycle apppool nameOfAppPool
curl...(call web method with headers and parameters identical to what IE does)
%windir%\system32\inetsrv\appcmd.exe start site nameOfSite
在 Fiddler 中,调用curl
看起来与使用 IE 进行调用完全相同。此外,我用curl
暂停替换了调用,因此脚本让我有机会使用 IE 调用 Web 方法。所以我很确定不是那行。
我在各个步骤之间设置了延迟。
我已尝试启动/停止 appPool(而不是回收)。
我尝试用 Python 做同样的事情:
subprocess.check_output([params to call appcmd], shell=True)
这些尝试都无法改变行为:
- 每一步都报告成功
- 有时网站实际上是可以运行的,并且一切正常
- 很多时候,网站会在一分钟后再次关闭。如果我通过 IIS 和 IE 执行这些步骤,这种情况永远不会发生。
- 有时最后一步没有成功,网站仍然处于瘫痪状态。
当脚本失败时,仅仅重新运行脚本是行不通的。我必须手动执行这些步骤,然后一切才好。
我觉得这毫无意义。你觉得呢?有没有其他方法可以appcmd
更接近 IIS 在启动/停止/回收时所做的操作?我做错了什么?
答案1
运行脚本的用户帐户的权限是什么。
我假设您是管理员,但是脚本运行时帐户也是管理员级别的帐户吗?
检查一下....