首页 > 解决方案 > ASP.NET Core WebAPI XML 方法参数反序列化

问题描述

我正在尝试在 .NET Core 3.1 上创建一个 WebAPI 控制器,它支持 JSON 和 XML 作为请求/响应内容类型。

控制器在接收带有“application/json”的 JSON 时工作得很好,但是当它接收带有“application/xml”的 XML 时,方法参数是使用默认值创建的,而不是在请求正文中发布的值。

示例项目 - https://github.com/rincew1nd/ASPNetCore_XMLMethods

启动中的附加 XML 序列化程序:

services.AddControllers().AddXmlSerializerFormatters();

带有方法和测试模型的控制器:

    [ApiController]
    [Route("[controller]")]
    public class TestController : ControllerBase
    {
        [HttpPost, Route("v1")]
        [Consumes("application/json", "application/xml")]
        [Produces("application/json", "application/xml")]
        public TestRequest Test([FromBody] TestRequest data)
        {
            return data;
        }
    }

    [DataContract]
    public class TestRequest
    {
        [DataMember]
        public Guid TestGuid { get; set; }
        [DataMember]
        public string TestString { get; set; }
    }

PS 项目包含用于 API 测试目的的 Swagger。

标签: asp.net-coreasp.net-web-apixml-serializationasp.net-core-3.1

解决方案


您的 xml 发布请求正文使用骆驼案例,导致模型绑定为空。

添加using Swashbuckle.AspNetCore.SwaggerGen;starup.cs尝试配置如下代码:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers().AddXmlSerializerFormatters();

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "Neocase <-> 1C Integration", Version = "v1" });
            c.SchemaFilter<XmlSchemaFilter>();
        });

    }
public class XmlSchemaFilter : Swashbuckle.AspNetCore.SwaggerGen.ISchemaFilter
    {
        public void Apply(OpenApiSchema model, SchemaFilterContext context)
        {
            if (model.Properties == null) return;

            foreach (var entry in model.Properties)
            {
                var name = entry.Key;
                entry.Value.Xml = new OpenApiXml
                {
                    Name = name.Substring(0, 1).ToUpper() + name.Substring(1)
                };
            }
        }
    }

推荐阅读