Adjust MVC 4 WebApi XmlSerializer to lose the nameSpace

前端 未结 4 1841
温柔的废话
温柔的废话 2020-12-05 15:28

I\'m working on a MVC WebAPI, that uses EF with POCO classes for storage. What I want to do is get rid of the namespace from the XML, so that the endpoints would return and

4条回答
  •  孤街浪徒
    2020-12-05 16:06

    I have customized Boris's answer to MVC Webapi 5. Use either of the following http headers render the result using the CustomFormatter:

    accept: application/xml

    accept: text/xml

    WebApiConfig.cs :

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
    
            GlobalConfiguration.Configuration.Formatters.Add(new CustomXmlFormatter());
            GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
        }
    }
    

    CustomXmlFormatter.cs :

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Net.Http.Formatting;
    using System.Net.Http.Headers;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web;
    using System.Xml.Serialization;
    
    namespace Custom.Formatter
    {
        public class CustomXmlFormatter: MediaTypeFormatter
        {
            private  UTF8Encoding encoder;
    
            public CustomXmlFormatter()
            {
                SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml"));
                SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml"));
                encoder = new UTF8Encoding(false, true);
            }
    
            public override bool CanReadType(Type type)
            {
                if (type == (Type)null)
                    throw new ArgumentNullException("type");
    
                //Type filtering
                if (type == typeof(SendEmailMessageResponse) || type == typeof(SendSmsMessageResponse))
                    return true;
                else
                    return false;
            }
    
            public override bool CanWriteType(Type type)
            {
                return true;
            }
    
            public override Task ReadFromStreamAsync(Type type, Stream stream, HttpContent content, IFormatterLogger formatterLogger)
            {
                return Task.Factory.StartNew(() =>
                        {
                            using (var streamReader = new StreamReader(stream, encoder))
                            {
                                var serializer = new XmlSerializer(type);
                                return serializer.Deserialize(streamReader);
                            }
                        });
            }
    
            public override Task WriteToStreamAsync(Type type, object value, Stream stream,    HttpContent content, TransportContext transportContext)
            {
                var serializer = new XmlSerializer(type);
                return Task.Factory.StartNew(() =>
                        {
                            using (var streamWriter = new StreamWriter(stream, encoder))
                            {
                                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                                ns.Add("", "");
                                serializer.Serialize(streamWriter, value, ns);
                            }
                        });
            }
        }
    }
    
        

    提交回复
    热议问题