private bool LookupFileInfo( PathString subPath, string contentType, out StaticFileInfo staticFileInfo) { var fileInfo = _fileProvider.GetFileInfo(subPath.Value); if (fileInfo.Exists) { var length = fileInfo.Length; DateTimeOffset last = fileInfo.LastModified; // Truncate to the second. var lastModified = new DateTimeOffset( last.Year, last.Month, last.Day, last.Hour, last.Minute, last.Second, last.Offset) .ToUniversalTime(); long etagHash = lastModified.ToFileTime() ^ length; var etag = new EntityTagHeaderValue('\"' + Convert.ToString(etagHash, 16) + '\"'); staticFileInfo = new StaticFileInfo(fileInfo, etag, contentType); return(true); } staticFileInfo = default; return(false); }
private async Task SendAsync(HttpContext context, StaticFileInfo fileInfo) { SetCompressionMode(context); context.Response.StatusCode = 200; context.Response.ContentLength = fileInfo.File.Length; context.Response.ContentType = fileInfo.ContentType; ResponseHeaders headers = context.Response.GetTypedHeaders(); headers.LastModified = fileInfo.File.LastModified; headers.ETag = fileInfo.EntityTagHeader; headers.Headers[HeaderNames.AcceptRanges] = "bytes"; try { await context.Response.SendFileAsync( fileInfo.File, 0, fileInfo.File.Length, context.RequestAborted); } catch (OperationCanceledException) { context.Abort(); } }