/// <inheritdoc />
        public override Task WriteResponseBodyAsync([NotNull] OutputFormatterContext context)
        {
            var tempWriterSettings = WriterSettings.Clone();

            tempWriterSettings.Encoding = context.SelectedEncoding;

            using (var xmlWriter = CreateXmlWriter(context.HttpContext.Response.Body, tempWriterSettings))
            {
                var obj         = context.Object;
                var runtimeType = obj?.GetType();

                var resolvedType = ResolveType(context.DeclaredType, runtimeType);

                var wrappingType = GetSerializableType(resolvedType);

                // Wrap the object only if there is a wrapping type.
                if (wrappingType != null && wrappingType != resolvedType)
                {
                    var wrapperProvider = WrapperProviderFactories.GetWrapperProvider(
                        new WrapperProviderContext(
                            declaredType: resolvedType,
                            isSerialization: true));

                    obj = wrapperProvider.Wrap(obj);
                }

                var dataContractSerializer = GetCachedSerializer(wrappingType);
                dataContractSerializer.WriteObject(xmlWriter, obj);
            }

            return(Task.FromResult(true));
        }
Example #2
0
        /// <summary>
        /// Called during serialization to get the XML writer to use for writing objects to the stream.
        /// </summary>
        /// <param name="writeStream">The <see cref="Stream"/> to write to.</param>
        /// <param name="content">The <see cref="HttpContent"/> for the content being written.</param>
        /// <returns>The <see cref="XmlWriter"/> to use for writing objects.</returns>
        protected internal virtual XmlWriter CreateXmlWriter(Stream writeStream, HttpContent content)
        {
            Encoding          effectiveEncoding = SelectCharacterEncoding(content != null ? content.Headers : null);
            XmlWriterSettings writerSettings    = WriterSettings.Clone();

            writerSettings.Encoding = effectiveEncoding;
            return(XmlWriter.Create(writeStream, writerSettings));
        }
Example #3
0
        /// <inheritdoc />
        public override Task WriteResponseBodyAsync([NotNull] OutputFormatterContext context)
        {
            var tempWriterSettings = WriterSettings.Clone();

            tempWriterSettings.Encoding = context.SelectedEncoding;

            var innerStream = context.ActionContext.HttpContext.Response.Body;

            using (var outputStream = new DelegatingStream(innerStream))
                using (var xmlWriter = CreateXmlWriter(outputStream, tempWriterSettings))
                {
                    var dataContractSerializer = (DataContractSerializer)CreateSerializer(GetObjectType(context));
                    dataContractSerializer.WriteObject(xmlWriter, context.Object);
                }

            return(Task.FromResult(true));
        }
Example #4
0
        /// <inheritdoc />
        public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (selectedEncoding == null)
            {
                throw new ArgumentNullException(nameof(selectedEncoding));
            }

            var writerSettings = WriterSettings.Clone();

            writerSettings.Encoding = selectedEncoding;

            // Wrap the object only if there is a wrapping type.
            var value        = context.Object;
            var wrappingType = GetSerializableType(context.ObjectType);

            if (wrappingType != null && wrappingType != context.ObjectType)
            {
                var wrapperProvider = WrapperProviderFactories.GetWrapperProvider(new WrapperProviderContext(
                                                                                      declaredType: context.ObjectType,
                                                                                      isSerialization: true));

                value = wrapperProvider.Wrap(value);
            }

            var dataContractSerializer = GetCachedSerializer(wrappingType);

            using (var textWriter = context.WriterFactory(context.HttpContext.Response.Body, writerSettings.Encoding))
            {
                using (var xmlWriter = CreateXmlWriter(textWriter, writerSettings))
                {
                    dataContractSerializer.WriteObject(xmlWriter, value);
                }

                // Perf: call FlushAsync to call WriteAsync on the stream with any content left in the TextWriter's
                // buffers. This is better than just letting dispose handle it (which would result in a synchronous
                // write).
                await textWriter.FlushAsync();
            }
        }
Example #5
0
        /// <inheritdoc />
        public override Task WriteResponseBodyAsync([NotNull] OutputFormatterContext context)
        {
            var response = context.ActionContext.HttpContext.Response;

            var tempWriterSettings = WriterSettings.Clone();

            tempWriterSettings.Encoding = context.SelectedEncoding;

            var innerStream = context.ActionContext.HttpContext.Response.Body;

            using (var outputStream = new DelegatingStream(innerStream))
                using (var xmlWriter = CreateXmlWriter(outputStream, tempWriterSettings))
                {
                    var runtimeType = context.Object == null ? null : context.Object.GetType();

                    var type          = GetSerializableType(context.DeclaredType, runtimeType);
                    var xmlSerializer = CreateSerializer(type);
                    xmlSerializer.Serialize(xmlWriter, context.Object);
                }

            return(Task.FromResult(true));
        }
Example #6
0
        /// <inheritdoc />
        public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var writerSettings = WriterSettings.Clone();

            writerSettings.Encoding = context.ContentType?.Encoding ?? Encoding.UTF8;

            // Wrap the object only if there is a wrapping type.
            var value        = context.Object;
            var wrappingType = GetSerializableType(context.ObjectType);

            if (wrappingType != null && wrappingType != context.ObjectType)
            {
                var wrapperProvider = WrapperProviderFactories.GetWrapperProvider(new WrapperProviderContext(
                                                                                      declaredType: context.ObjectType,
                                                                                      isSerialization: true));

                value = wrapperProvider.Wrap(value);
            }

            var dataContractSerializer = GetCachedSerializer(wrappingType);

            using (var textWriter = context.WriterFactory(context.HttpContext.Response.Body, writerSettings.Encoding))
            {
                using (var xmlWriter = CreateXmlWriter(textWriter, writerSettings))
                {
                    dataContractSerializer.WriteObject(xmlWriter, value);
                }
            }

            return(TaskCache.CompletedTask);
        }