【发布时间】:2014-09-07 07:32:30
【问题描述】:
我遇到了一个非常奇怪的问题,我无法理解,我希望有人可以帮助我。
设置
我在 Windows 机器上运行 Apache WebServer,并且我已经对其进行了配置,以便可以执行 .exe 文件(例如http://mydomain.com/program.exe)。 .exe 是使用 VB.net 生成的。
理想执行
当我向 .exe 发出 POST 请求时,.exe 会从 STDIN 读取数据,对其进行解析并采取相应措施。这种方法效果很好。
错误情况
有时,许多 POST 请求会非常接近(大约 30 个在 1-3 秒内)。在这种情况下,有时一个请求会出现问题。问题是 STDIN 中没有数据。
迄今为止的调试方法失败
我在 VB.net 中使用以下代码来获取数据:
Public Shared Function getPostData() As String
Dim contentLength = Environ(CGI_CONTENT_LENGTH)
Dim buffer(contentLength - 1) As Char
Console.In.ReadBlock(buffer, 0, contentLength)
getPostData = New String(buffer)
End Function
发生错误时,Console.In.ReadBlock的返回值为0,也就是说STDIN中没有可读取的内容。
我已经使用了其他函数来进行读取,Console.In.ReadToEnd,甚至是here的方法。
可能的原因
我得出结论,可能会发生以下两种情况之一:
- Apache 没有将 STDIN 数据传递给 VB。
- VB 无法正确读取 STDIN。
我还假设 POST 数据没有正确发送,但我排除了每个数据包嗅探的可能性。
奇怪
这就是奇怪的地方:我编写了一个从 STDIN 读取的 perl 脚本,然后将数据通过管道传输到 .exe,然后获取其输出并将其传回。换句话说,一个 perl 代理。当我使用这种方法时,问题就消失了。这可能意味着上述两个结论都不正确。
帮助
任何想法可能会发生什么?我很乐意提供所需的任何其他数据。
【问题讨论】:
-
在 Apache 中以什么方式运行 EXE?作为一个cgi脚本?还是其他方式?
-
正确。作为CGI。我在 httpd.conf 中添加了`AddHandler cgi-script .pl .cgi .exe`
-
@SamMakin 感谢您的链接!我试过了,但 lBytesRead 返回 0 (即它什么也没读)。这事儿常常发生。我确定应该有数据要读取,因为从 Console.In 读取确实会返回数据。关于这可能是什么的任何想法?
标签: vb.net windows apache stdin