【问题标题】:HttpListener running on Ubuntu/Mono returns 400 bad request在 Ubuntu/Mono 上运行的 HttpListener 返回 400 错误请求
【发布时间】:2014-04-21 21:45:48
【问题描述】:

我有一个在 Ubuntu 12.04LTS 和 Mono (mono-complete-2.10.8.1) 上运行的有问题的 .Net 应用程序,它在 localhost:8090 上启动了一个 HttpListener。每当我向服务器发送请求时,它都会立即退回 400-bad 请求。

我认为这可能是 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 默认设置为允许所有,但我为我正在侦听的端口戳了一个洞。

谢谢

编辑:此外,在上面的 sn-p 中也没有发现任何异常。

【问题讨论】:

  • 您是否尝试过在不执行程序的情况下执行请求?也许有别的东西正在接到你的电话……
  • 感谢您的回复。我刚刚尝试过,当服务器没有运行时,我得到“无法连接到服务器”。当它运行时,我收到“错误请求”。
  • 好吧,那么要找到正在发生的事情会有点困难,网络嗅探器或 http 代理可以为您提供很多帮助,通过它执行您的请求并查看真正请求的内容。
  • 感谢您的建议。奇怪的是,(我猜这并不奇怪),现在它正在接受和返回请求,因为它位于 Apache 反向代理后面。我不一定要强制我的客户使用代理,但我想还有更糟糕的情况。

标签: c# ubuntu mono


【解决方案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”、“+”和“*”似乎在 Windows 上工作,但当我在 Ubuntu 上部署 Mono 时,我必须专门添加一个使用主机名或接口 IP 地址的前缀。请注意,使用 IP 地址时,它必须是绑定到接口的地址,而不是它可能映射到的任何面向公众的外部 IP 地址。

【讨论】:

  • 是的!天哪救了我。遇到了同样的问题!谢谢!您可以只使用 * 因为它可能不完全匹配。 http.Prefixes.Add("http://*:80/");
  • @Arachnid 很高兴它可以提供帮助!
猜你喜欢
  • 2015-04-06
  • 1970-01-01
  • 2020-06-06
  • 2019-07-28
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多