WebClient 对大文件做了一些奇怪的事情

WebClient doing something weird with large file

我在 S3 存储桶前面有一个 Varnish 服务器。一个 API 会生成一个私有的 URL 并允许我通过 Varnish 服务器下载这个桶的私有文件。

每当我直接从存储桶或通过 Chrome 中的 Varnish-server 下载 500MB 的文件时,一切正常。

当我将相同的逻辑移动到 C# WebClient(代理设置为 NULL 并且仅发送用户代理 header)时,直接从存储桶下载工作正常。当我将 URL 更改为 Varnish-server 时,事情开始崩溃......它每次都会停止接收恰好 104.640KB 的文件。

我会得到一个 IOException 流意外结束。我已经尝试过 DownloadData、DownloadFile 和它们的 Async 对应项。它永远不会完成下载。

我从 .NET 2.0 一直到 4.5.1 来回切换。有谁知道为什么会发生这种情况?

我得出的结论是 Varnish headers 做了一些非常奇怪的事情。我最终设置了 OpenResty (nginx+lua) 并使用 S3CMD 在以某种方式请求 URL 时同步文件,并使用 LUA 制作与 pre-signed 类似的系统URL 的。事实证明,这与 C# WebClient 完美结合,最重要的是,我现在可以真正看到文件确实来自这个特定的服务器,如果 Varnish 缓存它,情况就不是这样了。