public async Task ExecuteResultAsync(ActionContext context) { var wrappedStream = context.HttpContext.Response.Body; using (var stream = new MemoryStream()) using (var streamReader = new StreamReader(stream, Encoding.UTF8)) { context.HttpContext.Response.Body = stream; string html = null; try { await _wrappedActionResult.ExecuteResultAsync(context); stream.Seek(0, SeekOrigin.Begin); { html = (await streamReader.ReadToEndAsync()).Trim(); } } finally { context.HttpContext.Response.Body = wrappedStream; } // Check for not XML if (IsHtmlContent(context, html)) { var headScript = _visualEditorScriptGenerator.CreateHeadScript(); var bodyScript = await _visualEditorScriptGenerator.CreateBodyScriptAsync(context); html = _htmlDocumentScriptInjector.InjectScripts(html, headScript, bodyScript); } var outputStream = new StreamWriter(wrappedStream, Encoding.UTF8, 1024, true); try { await outputStream.WriteAsync(html); await outputStream.FlushAsync(); } finally { // The "using" pattern would cause a sync flush which throws an error in NET Core 3.1 await outputStream.DisposeAsync(); } } }
public async Task ExecuteResultAsync(ActionContext context) { var wrappedStream = context.HttpContext.Response.Body; using (var stream = new MemoryStream()) { context.HttpContext.Response.Body = stream; string html = null; try { await _wrappedActionResult.ExecuteResultAsync(context); stream.Seek(0, SeekOrigin.Begin); html = Encoding.UTF8.GetString(stream.ToArray()).Trim(); } finally { context.HttpContext.Response.Body = wrappedStream; } // Check for not XML if (IsHtmlContent(context, html)) { var headScript = _visualEditorScriptGenerator.CreateHeadScript(); var bodyScript = await _visualEditorScriptGenerator.CreateBodyScriptAsync(context); html = _htmlDocumentScriptInjector.InjectScripts(html, headScript, bodyScript); } using (var outputStream = new StreamWriter(wrappedStream, Encoding.UTF8)) { await outputStream.WriteAsync(html); await outputStream.FlushAsync(); } } }