我有一个文件控制器负责处理块中的上传文件(1 MB块).我花时间在开发中测试它,一切都如预期.以下是操作的伪代码:
logger.Log("Getting InputStream");
var stream = Request.InputStream; // Here is the wait.
logger.Log("Got InputStream");
var bytes = GetByteArray(stream); // This is always less than 1 MB.
await FilesService.AppendToFileAsync(key, fileName, owner, bytes); // Write to the file.
// The GetByteArray method
private byte[] GetByteArray(Stream stream)
{
var bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
return bytes;
}
具体细节并不十分重要.我正在获取字节,然后我将它们附加到磁盘上的文件中.
然而,在生产中,事情变得奇怪.
这是上传一个块(生产中)的请求时间线:
通过记录我绝对知道所有的等待时间都花在了Request.InputStream道具上.
等待时间介于1分钟到3分钟之间.
我的问题
>这是否意味着服务器只花了那么多时间下载请求? (虽然我真的怀疑)
>或者我在这里做错了什么?
还有一个小问题:请求发送时间线告诉我何时在另一方收到内容字节?
我知道也许我应该写一个文件上传处理程序或者其他东西,但是这真的会产生很大的不同吗?
发生什么了?
编辑:
当然,我调查了许多看似相关的问题,但没有任何结果.
>我首先怀疑appdomain是在每个chunk请求上被回收的(因为我正在写一个文件)但我确认这不是日志中的情况.它也没有任何意义,因为wait在Request.InputStream上.
编辑2:
我刚用GetBufferlessInputStream测试了同一个动作中的手动读取,结果是一样的.现在我确定等待是在读取请求流时.在这一点上,我感觉服务器获取请求的速度很慢.我联系了我的主人,他们说他们没有限制速度,也不应该很慢.
要确认这一点,这是我上传一个块时的日志之一:
2015-09-15 23:23:12.6419|Entered upload chunk // This is the action.
2015-09-15 23:23:12.6419|Got bufferless stream // var s = Request.GetBufferlessStream()
2015-09-15 23:23:12.6419|Stream length: 1048576 (1 MB) // s.Length
2015-09-15 23:23:12.6419|Reading stream... // Here is the wait, this time it was not much (~26 secs) but it's still a lot.
2015-09-15 23:23:38.8211|Read stream of size 1048576 bytes (1 MB)
这就是我读它的方式:
var b = new byte[s.Length];
var read = 0;
var c = 0;
while ((c = s.Read(b, read, b.Length - read)) != 0)
{
read += c;
}
最佳答案 您应该更改计划,该服务器上有大量站点
参加高级计划以提高下载速度