A small package to allow using resume during transfering data over MVC application in ASP.NET Core.
It allows provide ETag header as well as Last-Modified one. It also supports following precondition headers: If-Match, If-None-Match, If-Modified-Since
, If-Unmodified-Since, If-Range.
As from version 2.0 resuming is supported out of box inside ASP.NET Core. So all code related to resuming was removed. I left only part for Content-Disposition inline.
Now all code relies on base .NET classes. Also support for multipart request is removed. To support that I would have to copy a lot of original code, because currently
there is no way to simple override some part of base classes.
Install using the ZNetCS.AspNetCore.ResumingFileResults NuGet package
PM> Install-Package ZNetCS.AspNetCore.ResumingFileResults
When you install the package, it should be added to your .csproj. Alternatively, you can add it directly by adding:
<ItemGroup>
<PackageReference Include="ZNetCS.AspNetCore.ResumingFileResults" Version="6.0.1" />
</ItemGroup>// Add services to the container.
builder.Services.AddResumingFileResult();In order to use the ResumingFileResults, you must configure the services in the ConfigureServices call of Startup:
public void ConfigureServices(IServiceCollection services)
{
services.AddResumingFileResult();
}Then in your controller you can use it in similar way as build in FileResult helpers.
using ZNetCS.AspNetCore.ResumingFileResults.Extensions;...
public IActionResult FileContents()
{
string webRoot = this.hostingEnvironment.WebRootPath;
var contents = System.IO.File.ReadAllBytes(Path.Combine(webRoot, "TestFile.txt"));
return this.ResumingFile(contents, "text/plain", "TestFile.txt");
}
...
public IActionResult FileStream()
{
string webRoot = this.hostingEnvironment.WebRootPath;
FileStream stream = System.IO.File.OpenRead(Path.Combine(webRoot, "TestFile.txt"));
return this.ResumingFile(stream, "text/plain", "TestFile.txt");
}
...
public IActionResult PhysicalFile()
{
string webRoot = this.hostingEnvironment.WebRootPath;
return this.ResumingPhysicalFile(Path.Combine(webRoot, "TestFile.txt"), "text/plain", "TestFile.txt");
}
...
public IActionResult VirtualFile()
{
return this.ResumingFile("TestFile.txt", "text/plain", "TestFile.txt");
}Above examples will serve your data as Content-Disposition: attachment. When fileName is not provided then data is served as Content-Disposition: inline. Additionaly
it is possible provide ETag and LastModified headers.
public IActionResult File()
{
return new ResumingVirtualFileResult("TestFile.txt", "text/plain", "\"MyEtagHeader\"")
{
FileDownloadName = "TestFile.txt",
LastModified = DateTimeOffset.Now
};
}