这是否意味着流没有被代码(使用using或调用dispose)处置?
即使在此代码外关闭流,仍会发生此异常?
这是否意味着流没有被代码(使用using或调用dispose)处置?
即使在此代码外关闭流,仍会发生此异常?
所以我的评论将作为答案:是的,流也可以从代码外部关闭,因此请确保检查 System.ObjectDisposedException
。
有几种情况可能会发生这种情况:例如想象一下与网络连接相关联的流,如果连接突然中断,根据实现方式,可能会关闭流并在访问流时抛出特定的异常。
如果请求长度磁盘阈值小于您正在尝试通过流上传/处理的文件大小,也会出现此错误。这在您的web.config中定义:
<httpRuntime maxRequestLength="512000" requestLengthDiskThreshold="512000" />
如果你看一下这里第二个参数的解释:
你会发现它设置了输入流缓冲区阈值(以千字节为单位)。默认值为80KB,因此如果您没有设置该值并且尝试上传大于80KB的文件,例如使用ajax上传,将会抛出System.ObjectDisposedException异常,因为一旦达到阈值限制,流就会关闭。
在我的情况下,我将阈值设置为500MB...
requestLengthDiskThreshold
更改为与 maxRequestLength
相同后问题得以解决,但似乎不应该需要这样做?据我所知,requestLengthDiskThreshold
只是文件在被缓冲到磁盘之前可以达到的最大大小,但是这种缓冲应该是透明的。难道 .NET 不应该从代码的角度来看为我们隐藏它吗?对于我们的代码而言,这只是一个流,我们的代码并不关心它是被流式传输到磁盘还是内存中,并且这个要求可能会随着时间的推移而发生变化... - tomRedox