I am using the beta version of MVC4 and am currently working on upgrading to the recently released RC version.
It seems that the complex types of queries with model binding have changed , but I can't figure out how / what I'm doing wrong.
For example, let's say I have the following API controller:
public class HomeApiController : ApiController { public TestModel Get() { return new TestModel { Id = int.MaxValue, Description = "TestDescription", Time = DateTime.Now }; } }
This gives the expected result:
<TestModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/xxxx"> <Description>TestDescription</Description> <Id>2147483647</Id> <Time>2012-06-07T10:30:01.459147-04:00</Time> </TestModel>
Now say that I'm just changing the signature, accepting the type of request, for example:
public TestModel Get(TestRequestModel request) { ... public class TestRequestModel { public int? SomeParameter { get; set; } }
Now I get the following error:
<Exception xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System.Web.Http.Dispatcher"> <ExceptionType>System.InvalidOperationException</ExceptionType> <Message> No MediaTypeFormatter is available to read an object of type 'TestRequestModel' from content with media type ''undefined''. </Message> <StackTrace> at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger) at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger) at System.Web.Http.ModelBinding.FormatterParameterBinding.ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken) at System.Web.Http.Controllers.HttpActionBinding.<>c__DisplayClass1.<ExecuteBindingAsync>b__0(HttpParameterBinding parameterBinder) at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() at System.Threading.Tasks.TaskHelpers.IterateImpl(IEnumerator`1 enumerator, CancellationToken cancellationToken) </StackTrace> </Exception>
I looked at the source where this exception was thrown in HttpContentExtensions , but it looks like it checks the content headers (which I should have) and if it doesn’t have what it is trying to get the formatter from the MediaTypeFormatter collection that it has for a specific type ( which he cannot) and then throws.
Has anyone else experienced this? Am I missing some global registration?
asp.net-mvc asp.net-web-api asp.net-mvc-4 model-binding
Brandon linton
source share