Win2k3 sp2 w/ii6, python7 配置为脚本映射(稍后详述)。python的新手,使用以下代码可以按预期工作:
import logging as log
import time
import win32api
LOG_FILENAME="C:\\logs\\iistest.log"
TIME_STEP=.0001
log.basicConfig(filename=LOG_FILENAME,filemode="w",level=log.DEBUG)
try:
win32api.SetConsoleCtrlHandler( \
lambda sig: log.debug("on_exit called with sig [%s]" % str(sig)), True)
log.debug("printing headers...")
# print "Status: 401 Unauthorized"
# print ""
print "Status: 200 OK"
print ""
log.debug("headers printed.")
for i in range(1,11):
time.sleep(TIME_STEP)
log.debug("Tick...(%.4f sec)" % (i*TIME_STEP))
log.debug("Done with main logic.")
except Exception as e:
log.debug("Generic Exception: \n-----\n%s\n-----" % e)
finally:
log.debug("In finally, cleaning up.")
调用http://localhost/webtest/authUrl/iistest.py
会在日志文件中获得以下空白页(再次,正如预期的那样)
DEBUG:root:printing headers...
DEBUG:root:headers printed.
DEBUG:root:Tick...(0.0001 sec)
DEBUG:root:Tick...(0.0002 sec)
DEBUG:root:Tick...(0.0003 sec)
DEBUG:root:Tick...(0.0004 sec)
DEBUG:root:Tick...(0.0005 sec)
DEBUG:root:Tick...(0.0006 sec)
DEBUG:root:Tick...(0.0007 sec)
DEBUG:root:Tick...(0.0008 sec)
DEBUG:root:Tick...(0.0009 sec)
DEBUG:root:Tick...(0.0010 sec)
DEBUG:root:Done with main logic.
DEBUG:root:In finally, cleaning up.
如果我交换打印语句401
而不是200
,客户端将获得预期的库存 IIS 401.5 Authorization failed by an ISAPI/CGI application.
,并且日志文件包含:
DEBUG:root:printing headers...
DEBUG:root:headers printed.
DEBUG:root:Tick...(0.0001 sec)
DEBUG:root:Tick...(0.0002 sec)
DEBUG:root:Tick...(0.0003 sec)
而已。 python.exe
过程消失了。服务器上的错误日志没有任何内容,IIS 的传输日志正确地将其记录为401.5
,但没有其他迹象表明出现任何问题。
如果我使用 py2exe 将脚本构建为可执行文件,将其放在子目录中并访问http://localhost/webtest/authUrl/dist/iistest.exe
,则没有问题,代码运行完成时出现 401,生成与 200 相同的日志。
在 WinXP/IIS5 机器上运行 .py scriptmap 设置,没有问题;执行.py
和 401 让日志填充完成。
这让我怀疑这与映射.py
到的应用程序扩展有关python.exe
,但我没有看到任何奇怪的地方。的相关位MetaBase.xml
:
ScriptMaps=".asa,C:\WINDOWS\system32\inetsrv\asp.dll,5,GET,HEAD,POST,TRACE
....
.py,C:\Python27\python.exe -u "%s" "%s",4
目录的设置位置:
<IIsWebDirectory Location ="/LM/W3SVC/1/ROOT/webtest/authUrl"
AccessFlags="AccessExecute | AccessRead | AccessScript"
AuthFlags="AuthBasic | AuthAnonymous"
>
<Custom
Name="UNCPassword"
ID="3003"
Value="{insertlonghexhere}"
Type="STRING"
UserType="IIS_MD_UT_FILE"
Attributes="INHERIT | SECURE"
/>
</IIsWebDirectory>
<IIsWebDirectory Location ="/LM/W3SVC/1/ROOT/webtest/authUrl/dist"
>
</IIsWebDirectory>
我知道退出处理程序没有触发,但我已经在 CLI 上使用 Ctrl-C 验证了它,而且我也不希望它与 TerminateProcess 一起使用。
我很想知道为什么会发生这种情况,没有看到任何关于 IIS 杀死 CGI 进程的谷歌信息。我知道我可以通过延迟打印标题来解决它,但我想了解. 有什么提示吗?
编辑:还注意到这不是完全超时。我可以将远程 winpdb 连接到脚本并单步执行,在语句之间等待 10 秒,并且一旦超过完成标题的第二次打印,调试器就会失去连接。
尝试了其他一些状态码:
- 301、302 和 404 几乎立即死亡。他们都记录
headers printed.
,并且始终未能达到第一个Tick
。 - 400 到死亡的时间与 401 相似
而且,当编译为.exe
并直接运行它时,所有这些工作都很好。