ASP.NET Web API - Model Binding not working with XML data on POST

asp.net-web-api

Solution

Add this in your `WebApiConfig.cs`:

config.Formatters.XmlFormatter.UseXmlSerializer = true;

This forced Web API to use XMLSerializer instead of DataContractSerializer and allows you to pass raw XML.

Otherwise you have to pass fully qualify datacontract XML i.e.:

<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Test.WebAPI.Controllers">
<FirstName>a</FirstName>
<LastName>b</LastName>
</Person> 

Problem

I have not been able to get model binding to work when doing a POST using XML data with ASP.NET Web API. JSON data works fine. Using a brand new Web API project, here are my model classes: ``` public class Person { public string FirstName { get; set; } public string LastName { get; set; } } public class PostResponse { public string ResponseText { get; set; } } ``` Here is my post method in the controller: ``` public PostResponse Post([FromBody]Person aPerson) { var responseObj = new PostResponse(); if (aPerson == null) { responseObj.ResponseText = "aPerson is null"; return responseObj; } if (aPerson.FirstName == null) { responseObj.ResponseText = "First Name is null"; return responseObj; } responseObj.ResponseText = string.Format("The first name is {0}", aPerson.FirstName); return responseObj; } ``` I am able to run it successfully with JSON from Fiddler: Request Headers: User-Agent: Fiddler Host: localhost:49188 Content-Type: application/json; charset=utf-8 Content-Length: 38 Request Body: {"FirstName":"Tom","LastName":"Jones"} Result: {"ResponseText":"The first name is Tom"} When passing in XML, the Person object is not hydrated correctly: Request Headers: User-Agent: Fiddler Host: localhost:49188 Content-Type: text/xml Content-Length: 79 Request Body: <Person> <FirstName>Tom</FirstName> <LastName>Jones</LastName> </Person> Result: <ResponseText>aPerson is null</ResponseText> From what I understand XML should work similar to JSON. Any suggestions on what I’m missing here? Thanks, Skip

Original source