1

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并直接运行它时,所有这些工作都很好。

4

1 回答 1

0

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

于 2011-03-02T17:46:16.637 回答