Назад | Перейти на главную страницу

Ошибка «Неверный дескриптор файла» при использовании Python / CGI в IIS 6.1

Задний план:

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

По сути, я сделал следующие шаги:

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

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

import cgi, cgitb

# Detailed error logging to screen
cgitb.enable()

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

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

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? Или, возможно, тот факт, что запрос доставляется через стандартный ввод, является неверным предположением?

Спасибо!

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

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

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