我的MVC应用程序中有一个操作方法,它根据数据库中保存为blob的文件返回FileResult
。根本问题是,对于某些文件类型,请求该文件会返回一个空文件,尽管我已经验证了数据库在Content
列中编码的内容是正确的。
然而,真正奇怪的是,我很难确定到底是什么导致了这种情况。以下是一些我无法理解的问题:
-
下载文本文件,如
*.txt
和*.csv
,会返回一个空文件,而下载(如PDF)则能正常工作 -
这只发生在我们的CI服务器上,我无法在本地工作站上复制它。这些是我能想到的唯一区别:
- 我已经验证了在我的计算机上工作的提交在CI服务器上不工作
- 我已尝试将本地工作站连接到CI服务器的数据库引擎,但无法进行复制。换句话说,问题出在代码中,而不是数据库中(但正如所指出的,本地工作的同一代码在CI服务器上不工作…)
- CI服务器运行IIS7,而我在Visual Studio附带的IIS Express上进行本地测试
我怎么拍这个?是什么原因造成的?
好吧,正如从问题的编写方式中所预期的那样,这个问题是我们的设置所特有的,所以对我来说,实际的解决方案可能没有那么有趣。然而,为了(希望)帮助其他遇到类似问题的人并找到他们的方法(欢迎!),我将发布故障排除活动的摘要,最终帮助我找到根本原因并解决它。
tl;dr:这种情况下的问题是自定义HTTP压缩——当关闭时,一切都正常
对这类问题进行故障排除-提示本可以帮助我更快地解决此问题:
-
您是否确信您的本地设置反映了生产/暂存环境的设置?不仅是他们应该,而且他们实际上确实这样做了——如果你在复制错误时遇到问题,那么几乎可以肯定是由于这里的某些原因。
有些事情可能会有所不同:
- 生成配置:生成脚本中的
Debug
/Release
/OtherConf
设置?在IDE中 Web.config
:我们有一个供开发人员使用的本地Web.config
文件,但在我们的构建脚本中基于模板Web.config.erb
创建生产版本。所有版本都匹配吗- IIS设置:生产/暂存服务器上的IIS中是否有一些自定义设置,用于处理非
text/html
数据的服务(或任何失败的数据)?您在本地使用相同的设置吗
还是什么都没找到?好吧,除了手动之外,还有其他方法可以查找差异。
- 生成配置:生成脚本中的
-
尝试绕过CI生成过程,并将应用程序的本地(工作)版本发布到服务器。希望它能揭示你错过的一些差异。
-
如果您仍然找不到不同的设置,并且仍然无法在本地复制它,您可以在服务器上调试吗?如果服务器上没有安装VS,可以尝试远程调试。(在我发现问题之前,我没能让它正常工作,主要是因为它在我们的设置上非常慢,但它非常值得一试…)