I found a solution to my problem but I am sure I am not doing it right.
Here is an example of the xml I am trying to post and the C# classes it supposed to deserialize to.
<customer> <customerid>100</customerid> <orders> <order><orderid>1</orderid><amount>1</amount></order> <order><orderid>2</orderid><amount>2</amount></order> </orders> </customer>
public class Customer { public Customer() { Orders = new List(); } public string CustomerId { get; set; } public List Orders { get; set; } } public class Order { public string OrderId { get; set; } public int Amount { get; set; } }
The only thing I get is CustomerId = 100. Orders count is 0. If I switch the Content-Type to application/json then it deserialized correctly.
After many trials and errors, I noticed that the Type parameter of the OnReadFromStreamAsync in XmlSerializer is IKeyValueModel instead of Customer like I expected.
I ended up writing my own XmlFormatter and replace the default one with mine. I added this two lines to my Application_Start method.
GlobalConfiguration.Configuration.Formatters.Add(new CustomXmlFormatter()); GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
Here is mine CustomXmlFormatter class.
public CustomXmlFormatter() { SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml")); SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml")); Encoding = new UTF8Encoding(false, true); } protected override bool CanReadType(Type type) { if (type == (Type)null) throw new ArgumentNullException("type"); if (type == typeof(IKeyValueModel)) return false; return true; } protected override bool CanWriteType(Type type) { return true; } protected override Task
No comments:
Post a Comment