打印401标题后IIS6会杀死python cgi脚本吗?

时间:2010-11-04 21:27:14

标签: python iis cgi http-status-code-401

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让日志填写完成。

这让我怀疑它与应用程序扩展映射.pypython.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秒钟,并且当它通过第二个完成标题的打印时,调试器失去连接。

尝试了其他一些状态代码:

  • 301,302和404几乎立即死亡。它们全部记录headers printed.,始终无法转到第一个Tick
  • 400有一个类似的时间,直到死亡为401

而且,在编译成.exe并直接运行时,所有这些工作都很好。

1 个答案:

答案 0 :(得分:0)

嗯。我已经在IIS上完成了一些perl CGI工作,但不是python,所以我真的无法直接帮助你。不过,我是黄旗,关于元数据库摘录中的“自定义”标签。 UNCPassword属性不应注册为Custom标记。我之前已将整个虚拟目录导入为海关,并且它们会产生不可预测的结果。祝你好运(4个月后)。