背景:
我曾尝试(重点强调“尝试”)通过 IIS(6.1,Windows Server 2008 R1)设置一个应用程序,该应用程序通过 Python 脚本路由所有请求。最终目标是在服务器上创建一个非常轻量级的 API。
基本上,我采取了以下步骤:
- 为 Windows 添加了 CGI 功能
- 在默认网站
*
添加了接受并运行的处理程序映射c:\Python27\python.exe -u "c:\inetpub\wwwroot\testapi\cgiadapter.py"
- 将应用程序的虚拟目录设置为
testapi
- 将应用程序的物理路径设置为
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'
然后,我尝试更新脚本以读取来自标准输入
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 的限制?或者,请求通过 stdin 传递是一个错误的假设?
谢谢!
答案1
我遇到了同样的问题,发现在 IIS 下,您需要使用 CONTENT_LENGTH 环境变量来限制从 stdin 读取的数据量。以下是我添加到代码中以使其在 IIS7 上运行的内容:
try:
import os
request = sys.stdin.read(int(os.environ['CONTENT_LENGTH']))
except:
request = ''
答案2
有点晚了...但我认为stdin
(fd 0)已经关闭了。