我尝试复制到MemoryStream,如下所示,但没有成功
MemoryStream m = new MemoryStream();
Request.Files[0].InputStream.CopyToAsync(m);
ToDo(NameOfFile, m);
转发我收到此消息:
未处理的类型' System.ObjectDisposedException' 发生在mscorlib.dll
答案 0 :(得分:1)
您需要await
异步方法,否则它可能在请求完成后完成执行。
using(var memoryStream = new MemoryStream())
{
await Request.Files[0].InputStream.CopyToAsync(memoryStream);
ToDo(NameOfFile, memoryStream);
}
注意:您还需要将所有方法设置为原始操作/页面异步。
答案 1 :(得分:1)
首先,您使用的是异步方法,因此您需要等待它;
01 MemoryStream m = new MemoryStream();
02 await Request.Files[0].InputStream.CopyToAsync(m);
03 ToDo(NameOfFile, m);
或者只使用CopyTo()
代替。如果你没有在第02行等待,那么工作将不会在第03行完成。
其次,由于输入流属于请求,我敢打赌,一旦Web请求完成,关于它的所有内容都会被清除,并且您的线程正在尝试复制请求内容太晚。
您可以简单地将01和02行移动到请求的主线程中吗?更喜欢的东西;
public Task<ActionResult> DoFileStuff()
{
MemoryStream m = new MemoryStream();
await Request.Files[0].InputStream.CopyToAsync(m);
new Thread(DoMoreWork).Start();
}
您明白了 - 在操作方法完成之前,将请求流加载到内存流中。
答案 2 :(得分:0)
您需要等待运行CopyToAsync的任务,否则它将在您访问正在填充的对象时运行
MemoryStream m = new MemoryStream();
await Request.Files[0].InputStream.CopyToAsync(m);
ToDo(NameOfFile, m);
另外,请注意,完成后需要.Dispose()内存流,或将其包装在using语句中