Обновление до MVC4 RC: нет MediaTypeFormatter для чтения объекта типа «TestRequestModel» из контента с типом мультимедиа «undefined»

Я использовал бета-версию MVC4 и в настоящее время работаю над обновлением до недавно выпущенной версии RC.

Похоже, что сложные типы запросов, связывающие модель, изменились, но я не могу понять, как/что я делаю неправильно.

Например, предположим, что у меня есть следующий контроллер API:

public class HomeApiController : ApiController
{
    public TestModel Get()
    {
        return new TestModel
        {
            Id = int.MaxValue,
            Description = "TestDescription",
            Time = DateTime.Now
        };
    }
}

Это дает ожидаемый результат:

<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>

Теперь предположим, что я просто меняю подпись, принимая тип запроса, например:

public TestModel Get(TestRequestModel request)
{
    ...

public class TestRequestModel
{
    public int? SomeParameter { get; set; }
}

Теперь я получаю следующая ошибка:

<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>

Я просмотрел исходный код, где это исключение вызывается в HttpContentExtensions, но похоже, что он проверяет заголовки содержимого (которые у меня должны быть), и если это не так 't have, что он пытается получить модуль форматирования из коллекции MediaTypeFormatter, которая у него есть для определенного типа (чего он не может), а затем выбрасывает.

Кто-нибудь еще сталкивался с этим? Какой-то глобальной регистрации мне не хватает?

8
задан Brandon Linton 7 June 2012 в 14:41
поделиться