asp.net-core - 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。
解决方案
您的 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)
};
}
}
}
推荐阅读
- android - 在每行回收视图中动态添加芯片
- c++ - 如何分隔字符串并将标记传递给方法
- php - 通过比较PHP中相同数组的元素值,使用用户定义的函数对关联数组进行排序
- javascript - 数组上的 Vue.js 过滤器 id
- javascript - 如何从 Google 表格的特定选项卡中获取所有数据并将多个文件夹合并到目标 Google 表格中
- javascript - 更改页面后关闭标签窗口浏览器
- ios - 无法远程构建 xcode 项目
- sql - OrmLite 注释之上的房间注释
- system-verilog - 非法_bin 声明中的条件如何解释?
- php - 如何使用 php 将 mp3、mp4 文件名与字符串分开?