MVC Web API忽略XmlSerializerFormat并使用DataContractSerliazer而不是

时间:2016-04-01 11:14:54

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

我在我的解决方案中有一个DTO和一个域项目,还有一个带有web api的MVC前端来公开数据。

我已经设置了web api控制器,并且操作是从DataService获取我的DTO对象。这一切都很棒,但是,我想要返回xml,我希望一些值在xml属性中,例如。

<root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<lookups>
<lookup category="General" field="Alert Type" value="Lack of Transparency" entityid="2273"/>
<lookup category="General" field="Alert Type" value="Unfair Terms " entityid="2274"/>
<lookup category="General" field="Alert Type" value="Operator Concerns" entityid="2275"/>
...
</lookups>
<paymentmethods />
<affiliates />
</root>

Lookup类如下:

[Serializable]
[XmlSerializerFormat]
public class Lookup
{
    [XmlAttribute("category")]
    public String Category { get; set; }

    [XmlAttribute("field")]
    public String Field { get; set; }

    [XmlAttribute("value")]
    public String Value { get; set; }

    [XmlAttribute("entityid")]
    public String EntityId { get; set; }

    public Lookup(String Category, String Field, String Value, int? EntityId = null)
    {
        this.Category = Category;
        this.Field = Field;
        this.Value = Value;
        this.EntityId = (EntityId != null ? EntityId.ToString() : null);
    }

    public Lookup() { }
}

最初我使用我的视图模型获得了我的DTO对象(例如Lookup,PaymentMethod和Affiliates),但是将它们移动到了我的DTO项目中。

我在global.asax

中设置了UseXmlSerializer = true

在将对象从hy viewmodels文件夹移动到DTO项目之前,它正在工作,我得到了所需的XML。移动后,它似乎忽略XmlSerializerFormat并使用DataContractSerliazer。

所以使用DataMember属性,我可以格式化xml,但显然我不能设置一些属性来序列化为xml属性

为什么它似乎忽略了[XmlSerializerFormat]和[XmlAttribute(“field”)]属性?

我读了几篇SO帖子: XmlSerializer ignores [XmlAttribute] in WebApi
How can you control .NET DataContract serialization so it uses XML attributes instead of elements?

1 个答案:

答案 0 :(得分:0)

我在这里找到了解决方法: http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#xml_pertype

在Global.asax中设置xml Serializer以处理特定类型的工作:

var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
xml.UseXmlSerializer = true;
xml.SetSerializer<FullResponseRoot>(new XmlSerializer(typeof(FullResponseRoot)));

其中FullResponseRoot是我序列化的对象的名称(上面提到的类是FullResponseRoot的属性) FullResponseRoot构成生成的xml的根节点