[英]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越過完成標題的第二張打印,調試器將失去連接。
嘗試了一些其他狀態代碼:
headers printed.
,並且始終未能到達第一個Tick
。 而且,在編譯為.exe
並直接運行它時,所有這些功能都可以正常工作。
嗯 我已經在IIS上做了一些perl CGI工作,但是沒有在python上做過,所以我真的不能直接為您提供幫助。 但是,在您的配置數據庫摘錄中,有關“自定義”標簽的內容我加了黃旗。 UNCPassword屬性不應注冊為自定義標記。 我以前將整個虛擬目錄作為海關導入,它們產生了不可預測的結果。 祝您好運(4個月后)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.