我在我的解决方案中有一个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?
答案 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的根节点