IIS6 убивает скрипт Python CGI после печати заголовка 401? - PullRequest
1 голос
/ 05 ноября 2010

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 и его непосредственном запуске.

1 Ответ

0 голосов
/ 02 марта 2011

Хммм.Я проделал некоторую работу с Perl CGI для IIS, но не для Python, поэтому я не смогу помочь вам напрямуюТем не менее, я отмечаю желтый флажок «Пользовательский» тег в отрывке из метабазы.Свойство UNCPassword не должно быть зарегистрировано как пользовательский тег.У меня были целые виртуальные каталоги, импортированные как таможня, и они дают непредсказуемые результаты.Желаем удачи (4 месяца спустя).

...