IIS6在打印401头之后终止python cgi脚本?

2024-04-23 18:15:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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会在日志文件中得到一个空白页,如预期的那样

^{pr2}$

如果我交换print语句,使其执行401而不是200,则客户机将获得预期的库存IIS401.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到{}有关,但我没有发现任何奇怪的地方。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>

我知道exit处理程序没有启动,但是我已经用CLI上的Ctrl-C验证了它,而且我也不希望它用TerminateProcess触发。在

我很想知道为什么会发生这种情况,没有看到任何关于IIS杀死CGI进程的google信息。我知道我可以通过延迟打印页眉来解决这个问题,但我想了解。有什么提示吗?在

编辑:还注意到这不是完全超时。我可以将一个远程winpdb连接到脚本并逐步执行,在语句之间等待10秒,一旦它超过完成标题的第二次打印,调试器就会失去连接。在

尝试了其他状态代码:

  • 301、302和404几乎立即死亡。它们都记录headers printed.,并且总是无法到达第一个Tick。在
  • 400的死亡时间和401差不多

但是,当编译到.exe并直接运行它时,所有这些都可以正常工作。在


Tags: pydebug脚本logrootsecexeheaders
1条回答
网友
1楼 · 发布于 2024-04-23 18:15:35

嗯,我在IIS上做了一些perl-CGI工作,但没有python,所以我不能直接帮助您。不过,我对你的元数据库摘录中的“自定义”标记发出了黄旗。UNCPassword属性不应注册为自定义标记。我以前把整个虚拟目录作为海关导入,它们会产生不可预测的结果。祝你好运(4个月后)。在

相关问题 更多 >