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

C# 在Ubuntu/Mono上运行的HttpListener返回400个错误请求,c#,ubuntu,mono,C#,Ubuntu,Mono,我在Ubuntu 12.04LTS和Mono(Mono-complete-2.10.8.1)上运行了一个有问题的.Net应用程序,它在本地主机8090上启动了一个HttpListener。每当我向服务器发送请求时,它都会立即回退400个错误的请求 我认为这可能是Ubuntu的事情,因为: -在Windows上运行时,完全相同的应用程序可以处理请求。事实上,无论是在MSFT CLR还是在Mono for Windows CLR中执行,它都会处理请求。 -根据其他日志记录,绑定成功。 -在获得上下文

我在Ubuntu 12.04LTS和Mono(Mono-complete-2.10.8.1)上运行了一个有问题的.Net应用程序,它在本地主机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,但我为正在侦听的端口戳了一个洞

谢谢


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

很抱歉,我在这方面迟到了,但是您绑定的是什么IP或主机名?我发现,对于Mono,它需要HTTP头中的主机头与aded的主机名前缀匹配,即

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代理可以帮助您很多,通过它执行请求,并查看真正请求的内容。谢谢您的建议。奇怪的是,(我想这并不奇怪),它现在坐在Apache反向代理后面,接受并返回请求。我不一定要强制我的客户使用代理,但我想还有更糟糕的情况。是的!天哪,救了我。我也有同样的问题!非常感谢。您可以只使用*,因为它可能不完全匹配。http.Prefixes.Add(“http://*:80/”@蛛形纲动物很高兴它能帮上忙!