【问题标题】:why is .net core 5 webapi xml serializer different that swaggers serializer?为什么 .net core 5 webapi xml 序列化程序与 swaggers 序列化程序不同?
【发布时间】:2021-06-27 23:25:13
【问题描述】:

我在我的 .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 以使它们匹配?

【问题讨论】:

    标签: asp.net-core asp.net-web-api swagger xml-serialization swagger-ui


    【解决方案1】:

    你的模型错了,应该如下图

    [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;}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 2023-03-21
      • 2014-01-06
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多