在Ubuntu / Mono上运行的HttpListener返回400个错误请求

时间:2014-04-21 21:45:48

标签: c# ubuntu mono

我有一个在Ubuntu 12.04LTS和Mono(mono-complete-2.10.8.1)上运行的有问题的.Net应用程序,它在localhost:8090上旋转了一个HttpListener。无论何时我向服务器发送请求,它都会立即回复400个错误的请求。

我认为这可能是一个Ubuntu的事情,因为: - 在Windows上运行时,完全相同的应用程序处理请求就可以了。实际上,它处理请求是否在MSFT CLR或Mono for Windows CLR中执行。 - 根据其他日志记录,绑定成功。 - 我在获取上下文后立即有一个日志记录语句,如下所示:

try {
  var context = httpListener.GetContext();
  Log.Debug("Request received");
  // Send to handlers, etc...
} catch (Exception ex) {
  Log.Error("HttpListener error: {0}", ex.Message);
}

现在在Ubuntu设置上,永远不会报告该日志记录语句,但我仍然设法恢复400,所以我只能假设HttpListener要么从未得到请求,要么在给我更改之前生成响应处理它。

如果有的话,有人可以建议如何排除故障吗?我在Linux中充其量只是少年。虽然默认情况下iptables设置为允许all,但我为我正在侦听的端口挖了个洞。

由于

编辑:此外 - 上述代码段中没有任何异常。

1 个答案:

答案 0 :(得分:1)

对不起,我这么迟到了,但是你绑定了什么IP或主机名?我发现使用Mono时,它要求HTTP头中的HOST头与主题名前缀相匹配,即

HttpListener http = new HttpListener();
http.Prefixes.Add("http://hostname.com:80/");
http.Start();

它要求HTTP请求本身(在线路上)中的任何内容都存在Host:hostname.com。

使用IP地址时," 127.0.0.1"," localhost"," 0.0.0.0"," +&#34 ;和" *"似乎在Windows上工作,当我在Ubuntu上部署Mono时,我必须专门添加一个使用主机名或接口的IP地址的前缀。请注意,使用IP地址时,它必须是绑定到接口的IP地址,而不是它可能映射到的面向公众的外部IP地址。