簡體   English   中英

IIS6打印401標頭后殺死python cgi腳本嗎?

[英]IIS6 kills python cgi script after printing 401 header?

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 ,則客戶端將獲得401.5 Authorization failed by an ISAPI/CGI application.的預期庫存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

目錄的設置位置:

<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進程的任何Google信息。 我知道可以通過延遲打印標題來解決此問題,但是我想了解 有什么提示嗎?

編輯:還注意到這不是總超時。 我可以將遠程winpdb連接到腳本並逐步執行,在語句之間等待10秒鍾,隨着SOON越過完成標題的第二張打印,調試器將失去連接。

嘗試了一些其他狀態代碼:

  • 301、302和404幾乎立即死亡。 它們都記錄了日志headers printed. ,並且始終未能到達第一個Tick
  • 400死亡之前的時間與401類似

而且,在編譯為.exe並直接運行它時,所有這些功能都可以正常工作。

我已經在IIS上做了一些perl CGI工作,但是沒有在python上做過,所以我真的不能直接為您提供幫助。 但是,在您的配置數據庫摘錄中,有關“自定義”標簽的內容我加了黃旗。 UNCPassword屬性不應注冊為自定義標記。 我以前將整個虛擬目錄作為海關導入,它們產生了不可預測的結果。 祝您好運(4個月后)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM