Here is a very simple example how I can return a Stream
to ASP.NET MVC:
public ActionResult DownloadData(...)
{
using(var lib = new SomeLibrary())
{
// do some stuff...
var stream = new MemoryStream();
lib.SaveAs(stream);
stream.Position = 0;
return File(stream, "contenttype", "filename");
}
}
The problem is that MemoryStream
will be allocated in large heap object area and on 32 bit system it will cause OutOfMemoryException
quite soon because of RAM fragmentation that will prevent allocation of a large memory block even if there is enough memory. On 64 bit systems this method is also quite slow.
What I want is just return a stream, similar to this
public ActionResult DownloadData(...)
{
using(var lib = new SomeLibrary())
{
// do some stuff...
return File(lib.Stream, "contenttype", "filename");
}
}
However then the using
statement will call .Dispose()
before my data is returned. If I remove the using
statement completely, then the library will lock resources until garbage collector clean up memory.
I think the best solution will be to use a generic Stream
that just copy the source stream and call .Dispose()
at the end:
public ActionResult DownloadData(...)
{
var lib = new SomeLibrary()
try
{
// do some stuff...
var stream = new CopyStream(lib.Stream, lib);
return File(stream, "contenttype", "filename");
}
catch(Exception)
{
lib.Dispose();
throw;
}
}
The generic stream should call .Dispose()
for the second parameter lib
after closing.
Is there any existing implementation for such a Stream
in .NET or NuGet?