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.")
Invoking 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.
Запустил настройку .py scriptmap на машине с WinXP / IIS5, проблемы НЕ было; выполнение .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>
Я знаю, что обработчик выхода не сработал, но я проверил, что он работает с Ctrl-C на CLI, и я не ожидаю, что с TerminateProcess все равно.
У меня довольно много идей о том, почему это происходит, я не видел никакой информации Google о том, что IIS убивает процессы CGI. Я знаю, что могу обойти это, отложив печать заголовка, но я хочу понять . Есть намеки?
Редактировать: Также отмечено, что это не общее время ожидания. Я могу подключить удаленный winpdb к сценарию и пройти через него, ожидая 10 секунд секунд между операторами, и в СКОРОЕ, когда он проходит после второй печати, которая завершает заголовки, отладчик теряет связь.
Пробовал некоторые другие коды состояния:
- 301, 302 и 404 умирают почти НЕМЕДЛЕННО. Все они регистрируют
headers printed.
и постоянно не могут добраться до первого Tick
.
- 400 имеет столько же времени до смерти, сколько 401
И все же, все это прекрасно работало при компиляции в .exe
и его непосредственном запуске.