【问题标题】:How to remove namespace from WEB API request & response XML?如何从 WEB API 请求和响应 XML 中删除命名空间?
【发布时间】:2020-07-16 09:02:30
【问题描述】:

我想从 WEB API 请求和响应中删除突出显示的节点。 下面是 web api 中使用的类 Models

 [DataContract(Namespace = "")]
    public class ValidateRequest
    {
        [DataMember]
        public string Client_Code { get; set; }
        [DataMember]
        public string ClientValidateNo { get; set; }
        [DataMember]
        public string UserID { get; set; }
        [DataMember]
        public string Password { get; set; }
    }

[DataContract(Namespace = "")]
    public class ValidateResponse
    {
    }

【问题讨论】:

    标签: c# asp.net-web-api asp.net-web-api2 asp.net-core-webapi webapi


    【解决方案1】:

    我想从 WEB API 请求和响应中删除突出显示的节点。 下面是 web api 中使用的类 Models

    要实现这个功能,首先需要创建一个继承自XmlSerializerOutputFormatter的类:

    public class XmlSerializerOutputFormatterNamespace : XmlSerializerOutputFormatter
            {
                protected override void Serialize(XmlSerializer xmlSerializer, XmlWriter xmlWriter, object value)
                {
                    //applying "empty" namespace will produce no namespaces
                    var emptyNamespaces = new XmlSerializerNamespaces();
                    emptyNamespaces.Add("", "any-non-empty-string");
                    xmlSerializer.Serialize(xmlWriter, value, emptyNamespaces);
                }
            }
    

    然后,在startup.cs的ConfigureServices中添加如下服务:

     services
        .AddMvc(options =>
        {
            options.OutputFormatters.Add(new XmlSerializerOutputFormatterNamespace());
        }).AddXmlSerializerFormatters();
    

    在api方法中:

       [Produces("application/xml")]
        public IActionResult GetXml(ValidateRequest request)
        {
            ValidateResponse response = new ValidateResponse()
            {
                Amount = 100,
                ClientValidateNo = request.ClientValidateNo,
                Client_Code = request.Client_Code,
                DepositorCity = "aaa",
                DepositorName = "das",
                DepositorState = "sadasd",
                Status = "fasfas"
            };
            return Ok(response);
        }
    

    测试结果:

    【讨论】: