Ошибка "Bad File Descriptor" при использовании Python/CGI в IIS 6.1

Фон:

Я попытался (с сильным акцентом на "попытку") настроить приложение через IIS (6.1, Windows Server 2008 R1), которое маршрутизирует все запросы через скрипт на python. Конечной целью было создание очень легкого API на сервере.

В основном я предпринял следующие шаги:

  1. Добавлена ​​функция CGI для окон
  2. Создано новое приложение на веб-сайте по умолчанию
  3. Добавлено отображение обработчика, который принимает * и работает c:\Python27\python.exe -u "c:\inetpub\wwwroot\testapi\cgiadapter.py"
  4. Установите виртуальный каталог приложения в testapi
  5. Установите физический путь к приложению c:\inetpub\wwwroot\testapi

Чтобы выполнить базовый тест, был протестирован и работает следующий скрипт:

import cgi, cgitb

# Detailed error logging to screen
cgitb.enable()

# Output basic response
print 'content-type:text/plain'
print
print 'Hello World'

Затем я пытаюсь обновить скрипт для чтения в запросе от stdin

import cgi, cgitb

# Detailed error logging to screen
cgitb.enable()

# Attempt to read the raw request from CGI
import sys
request = sys.stdin.read()

# Output basic response
print 'content-type:text/plain'
print
print 'Hello World'

Внезапно я получаю следующую ошибку: <type 'exceptions.IOError'>: [Errno 9] Bad file descriptor на строке, содержащей stdin.read(),

Вопрос:

Почему stdin считается плохим файлом?

Я что-то неправильно настроил в IIS или это ограничение для IIS? Или, может быть, тот факт, что запрос доставляется через стандартный ввод, неверно?

Спасибо!

2 ответа

У меня была та же проблема, и я обнаружил, что в IIS необходимо использовать переменную среды CONTENT_LENGTH, чтобы ограничить объем данных, которые вы читаете из stdin. Вот что я добавил в свой код, чтобы он работал на IIS7:

try:
    import os
    request = sys.stdin.read(int(os.environ['CONTENT_LENGTH']))
except:
    request = ''

Немного поздно... но я думаю, что stdin (FD 0) был закрыт.

Другие вопросы по тегам