【问题标题】:Apache and VB.net: cannot read STDINApache 和 VB.net:无法读取 STDIN
【发布时间】: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的方法。

可能的原因

我得出结论,可能会发生以下两种情况之一:

  1. Apache 没有将 STDIN 数据传递给 VB。
  2. 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


【解决方案1】:

您可能遇到数据编码问题。您是否尝试过将控制台的InputEncoding 属性设置为ASCIIEncoding(以便将字符大小设置为1)?否则,您应该断言输入数据被编码为默认控制台的编码。请注意,如果 Console 的当前编码与输入数据编码不匹配,您将因为读取无效块中的数据而导致读取不稳定。当然,您还必须设置OutputEncoding

【讨论】:

  • 谢谢。我会试试这个。但是,如果这是问题所在,我只会偶尔看到它而不是一直看到它,这对您有意义吗?赏金已过期,但无论是否有效,我都会奖励给你。
  • 不要担心奖项,但要担心你的问题 ;-) 确实,这很奇怪,我也不是 100% 确定,但我过去遇到过编码问题,症状也很相似:一些读取都可以,其他都失败了。试一试,让我们看看......
猜你喜欢
  • 2012-03-15
  • 2017-01-02
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 2022-07-03
  • 2015-07-03
相关资源
最近更新 更多