/// <inheritdoc /> public override async Task SerializeToResponse(RequestExecutionContext context) { var fileWriteStream = new FileBufferingWriteStream(); SetStatusAndContent(context, _contentType); try { using var textWriter = new StreamWriter(fileWriteStream); using var xmlWriter = new XmlTextWriter(textWriter); var serializer = GetSerializer(context.Result.GetType()); serializer.Serialize(xmlWriter, context.Result); xmlWriter.Flush(); textWriter.Flush(); await fileWriteStream.DrainBufferAsync(context.HttpContext.Response.Body, context.HttpContext.RequestAborted); } finally { await fileWriteStream.DisposeAsync(); } }
public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context) { //TODO maybe need wrapping logic? var value = context.Object; var xmlSerializer = GetCachedSerializer(context.ObjectType); var httpContext = context.HttpContext; var response = httpContext.Response; //Used so we get correct content-length var fileBufferingWriteStream = new FileBufferingWriteStream(); var responseStream = fileBufferingWriteStream; try { await using (var textWriter = context.WriterFactory(responseStream, Encoding.ASCII)) { //Hack because XmlWriter really wants to add encoding="us-ascii" which segfaults skate 3 await textWriter.WriteAsync("<?xml version=\"1.0\"?>"); using var xmlWriter = XmlWriter.Create(textWriter, _writerSettings); Serialize(xmlSerializer, xmlWriter, value); } response.ContentLength = fileBufferingWriteStream.Length; await fileBufferingWriteStream.DrainBufferAsync(response.Body); } finally { await fileBufferingWriteStream.DisposeAsync(); } }