如何解决为什么 .net core 5 webapi xml 序列化器与 swaggers 序列化器不同?
我在我的 .net core 5 web api 中启用了 xml 序列化程序:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddXmlSerializerFormatters()
//.AddXmlDataContractSerializerFormatters()
.AddJsonOptions(o =>
{
o.JsonSerializerOptions.PropertyNamingPolicy = null;
o.JsonSerializerOptions.Converters.Add(new System.Text.Json.Serialization.JsonStringEnumConverter());
});
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1",new OpenApiInfo { Title = $"Routing Evaluator Package Demo Service ({appSettings.Environment})",Version = "v1" });
});
}
我的控制器接受一个参数
[HttpPost]
public ActionResult<TestResponse> Post(TestRequest request)
{
...
}
我的模型是这样的:
[Serializable]
//[DataContract]
public class TestRequest
{
/// <summary>
/// The message addressing information
/// </summary>
//[DataMember]
[XmlArray("Items")]
[XmlArrayItem("Item")]
public Items Items { get; set; }
}
[Serializable]
[XmlRoot("Items")]
//[CollectionDataContract(Name = "Items")]
public class Items : List<Item>
{
}
[Serializable]
//[DataContract]
[XmlRoot("Item")]
public class Item
{
public string key {get;set;}
public string value {get;set;}
}
如果我手动序列化对象的一个实例,我会得到如下结果:
对象实例:
var request = new TestRequest()
{
Items = new Items()
{
new Item() {key = "A",value="1"},new Item() {key = "B",value="2"},new Item() {key = "C",value="3"}
}
};
序列化:
using (var str = new MemoryStream())
{
System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(DemoService.ServiceModels.EvaluationRequest));
ser.Serialize(str,request);
str.Flush();
str.Position = 0;
_output.WriteLine(str.ReadAsString());
}
结果:
<?xml version="1.0" encoding="utf-8"?>
<TestRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Items>
<Item>
<key>A</key>
<value>1</value>
</Item>
<Item>
<key>B</key>
<value>2</value>
</Item>
<Item>
<key>C</key>
<value>3</value>
</Item>
</Items>
</TestRequest>
如果我浏览到 swagger 页面,它显示的示例是:
<?xml version="1.0" encoding="UTF-8"?>
<TestRequest>
<Items>
<key>A</key>
<value>1</value>
</Items>
</TestRequest>
它提供的样本不正确。 swagger 使用的序列化器似乎与 AddXmlSerializerFormatters 指定的 web api 使用的序列化器不同。我是否需要以某种方式配置 swagger 以使它们匹配?
解决方法
你的模型有问题,应该如下图
[Serializable]
public class TestRequest
{
/// <summary>
/// The message addressing information
/// </summary>
//[DataMember]
[XmlArray("Items")]
[XmlArrayItem("Item")]
public List<Item> Items { get; set; }
}
[Serializable]
public class Item
{
public string key {get;set;}
public string value {get;set;}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。