Example #1
0
        /// <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();
            }
        }
Example #2
0
        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();
            }
        }