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.
如果我交换print语句使其执行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脚本映射设置,没有问题;执行.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
dir的设置:
<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秒钟,并且当它通过第二个完成标题的打印时,调试器失去连接。
尝试了其他一些状态代码:
headers printed.
,始终无法转到第一个Tick
。而且,在编译成.exe
并直接运行时,所有这些工作都很好。
答案 0 :(得分:0)
嗯。我已经在IIS上完成了一些perl CGI工作,但不是python,所以我真的无法直接帮助你。不过,我是黄旗,关于元数据库摘录中的“自定义”标签。 UNCPassword属性不应注册为Custom标记。我之前已将整个虚拟目录导入为海关,并且它们会产生不可预测的结果。祝你好运(4个月后)。