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

标签 c# ubuntu mono

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

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

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

谢谢

编辑:此外,在上面的代码片段中也没有发现任何异常。

最佳答案

抱歉,我来晚了,但是你绑定(bind)的是什么 IP 或主机名?我发现使用 Mono 它需要 HTTP header 中的 HOST header 与添加的主机名前缀匹配,即

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 时,我必须专门添加一个使用主机名或接口(interface) IP 地址的前缀。请注意,当使用 IP 地址时,它必须是绑定(bind)到接口(interface)的地址,而不是它可能映射到的任何面向公众的外部 IP 地址。

关于c# - 在 Ubuntu/Mono 上运行的 HttpListener 返回 400 错误请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23206570/

相关文章:

C# WinForm 按下 Tab 键,它到处跳转

c# - 检查 List<T> 的项目是否有效

c# - 数据不显示在数据网格中

c# - 如何接收 SQL Server 事件探查器事件?

python - Ubuntu:安装 tor 浏览器并将其与 Selenium Python 一起使用

mono - Xamarin Studio 是否绝对需要在 Mac App Store 上发布 Mono 应用程序且 MonoMacPackager 已过时?

amazon-web-services - 如何在 Amazon EC2 中设置时区?

php - dpkg 错误退出状态 2

mono - 在 Mono 中调试 SIGSEGV

c# - Mono SQLite 无法打开数据库