WebApi Controller模型序列化问题

时间:2015-05-06 11:25:53

标签: c# asp.net-web-api datacontractserializer

我在使用Web API控制器时遇到了一些奇怪的问题。我有一个在api控制器的动作中传递的集合。正在使用的对象是集合有4个属性。

当属性按特定顺序排列时,我的操作可以接受集合参数。见下文: -

    [HttpPost]
    public ForexRates UpdateRates([FromBody] Rates rates)
    {
        // TODO: Obviously code :) 
        return rates;
    }

此代码位于API控制器&来自邮递员的电话。见下文: -

<rates>
  <rate> 
   <id>fefef</id>
    <rate>35353.333</rate>
    <series>dfefge</series>
    <series-order>sfefefef</series-order>  
</rate></rates>

如果我改变了属性的顺序,我开始在动作中获得空值。有人可以解释一下这个:)

模特

public class Rate
{
    public string Id { get; set; }
    public string Date { get; set; }
    public double Rate { get; set; }
}

public class Rates : Collection<ForexRate>
{
}

3 个答案:

答案 0 :(得分:1)

您需要控制XML序列化的顺序。使用XmlElementAttribute并指定订单

有一个类似的问题here

仅供参考,我认为当您从PostMan提供给您的WebApi服务时,无法更改属性的顺序。您需要遵循确切的顺序。

如果您不想这样做,请将此Xml作为字符串参数传递,然后在方法内解析。

答案 1 :(得分:0)

默认活页夹在绑定期间在不同位置使用相同名称时可能会出现问题。

在你的情况下,你有Rate.Rate - 类名和属性名。尝试将您的班级更改为(和帖子的相应xml):

public class Rate
{
    public string Id { get; set; }
    public string Date { get; set; }
    public double Value { get; set; }
}

然后尝试更改订单。

虽然我没有明确的理由说明为什么它在一个订单而不是另一个订单中工作,但当它达到Rate(double)值时,它可能会尝试创建一个新的Rate(对象)但是没有正确的属性(因为它只是一个双倍)。

更复杂的解决方案是为Rate对象编写特定的模型绑定器。

答案 2 :(得分:0)

问题与DataContractSerializer有关,DataContractSerializer期望元素按特定顺序发生(按字母顺序考虑继承)。这是创建Web API项目时使用的默认序列化程序。

您可以覆盖它并在API配置期间指定不同的序列化程序,如下所示:

GlobalConfiguration.Configuration.Formatters.XmlFormatter
  .SetSerializer<SomeType>(new XmlSerializer(typeof(SomeType)));