在 Mono + FastCGI 中托管 ServiceStack 时二进制数据损坏

Posted

技术标签:

【中文标题】在 Mono + FastCGI 中托管 ServiceStack 时二进制数据损坏【英文标题】:Binary data corrupted when hosting ServiceStack in Mono + FastCGI 【发布时间】:2013-07-19 06:49:10 【问题描述】:

我有一个 ServiceStack 服务,它有一个处理 GET 请求的方法。该方法返回二进制数据。

public object Get(DownloadFile request) 
  return new HttpResult(new FileInfo("some file"), "application/octet-stream", asAttachment: true);

当主机是 Windows 时,它工作正常,但当我在 Linux 中使用 Mono+FastCGI 运行它时,我下载的数据不一样。

我分析了几个文件的返回字节,并得出结论认为存在模式。数据以这种方式包装:

original data size + \r\n + original data + \r\n\r\n0\r\n\r\n

为什么会发生这种情况以及如何解决?

编辑:

原来这是由于 HTTP 1.1 中的分块传输造成的。

Knocte 的回答为我指明了正确的方向,我能够通过强制我的请求使用 HTTP 1.0 来解决该问题:

var req = (HttpWebRequest)WebRequest.Create(url);
req.ProtocolVersion = new Version("1.0");

我不需要尝试 knocte 建议的补丁,但它看起来是解决问题的正确方法,而不是像我那样避免它。

【问题讨论】:

【参考方案1】:

我认为你受到了this bug 的影响。

如果附加到它的补丁对您有用,那么您可以清理它,并将其作为拉取请求提交给 github 中的 mono。

【讨论】:

以上是关于在 Mono + FastCGI 中托管 ServiceStack 时二进制数据损坏的主要内容,如果未能解决你的问题,请参考以下文章

Mono 中的自托管 WCF 服务

安装 XSP 时找不到包“mono”

内存是手游的硬伤——Unity游戏Mono内存管理与泄漏

从游戏脚本语言说起,剖析Mono所搭建的脚本基础

具有多个合同的 Mono WCF 休息服务“配置文件中未定义端点”

为啥在 Worker 角色中托管 WCF 服务