NancyFX / Linux / Mono - 大型上传(超过1MB)可在Windows服务器上运行,但不适用于Linux

时间:2014-07-15 08:15:01

标签: c# android linux mono nancy

我似乎有一个相当奇怪的问题,我想知道是否有人可以阐明。

我正在编写一个Android应用程序,它从自托管的C#服务器上传/下载文件。服务器是用C#编写的(使用NancyFX自主机),Android应用程序使用HttpClient(Apache)与服务器通信。

当我尝试在Windows上(我手动调试到服务器代码的位置)上传文件时,上传适用于任意长度的任意数量的文件。一切都按预期工作,小文件和大文件都上传。

但是,当我将此服务器部署到我的Linux机箱(OpenSuSe)并运行它时,上传的行为会有所不同。较小的文件(< 1MB)仍然按预期工作,但是当文件超过此限制时,HttpClient的.execute()会无限期挂起。我试图将套接字超时设置为10秒(测试),我曾经收到套接字超时异常,但有时候,它只是挂在那里,甚至没有超时。 还值得一提的是,请求永远不会到达服务器,这可能意味着问题很可能不是南希服务器(尽管我可能错了)。

鉴于问题的性质,我倾向于认为问题出在Linux服务器配置的某个地方,不管出于什么原因都不允许更大的POST请求,但是我还没弄清楚为什么会这样。我在同一个Linux机器上有一台PHP服务器,我可以上传大于1MB的文件,没有任何问题。

我尝试过的其他步骤:我已经禁用了Linux服务器上的防火墙以查看它是否是防火墙问题(因为< 1MB到达服务器就不太可能了)但是没有#39 ; t帮助。我还将MTU改为与我的Windows机器一致,但这也没有什么区别。

就目前而言,我没有想法。有谁知道如何进一步追踪这个以找到问题的根源?任何帮助将不胜感激。

非常感谢提前。

2 个答案:

答案 0 :(得分:1)

我花了很多时间用Google搜索来解决悬挂问题。问题出在Mono上,并已在最新版本(3.4)中修复。我在我的Linux机器上安装了这个版本,悬而未决的问题就消失了。

此处有更多详情: https://github.com/mono/mono/commit/a31b580fdcbaa9a8a16d59ffb12d04f5872f54e8

我现在有另一个问题。在服务器端检索的映像文件已损坏。鉴于相同的代码在Windows中运行,我倾向于认为问题取决于Mono或更可能,NancyFx的代码在Mono上。我将进一步调试并更新此问题的进度,以防其他任何人遇到同样的问题。

答案 1 :(得分:0)

因此,对于遇到此问题的任何人来说,第二个问题(文件被破坏)可以通过根据这篇文章编辑Nancy库中的RequestStream.cs来解决(看看Rohansi在4月30日发表的评论)

https://github.com/NancyFx/Nancy/issues/1333

这似乎是Linux上Mono的一个问题(我使用的是3.4),如果你在FileStream中指定了async标志,那么这个过程就不行了。

目前,我已经构建了Nancy的自定义版本,这就是我正在使用的版本。我会尝试让他们看看是否可以使用主库中的某些配置禁用异步,并且还会将问题提交给Mono dev但是现在,如果遇到这个问题,我希望上面的评论帮助你。