Я использую бета-версию MVC4 и в настоящее время работаю над обновлением до недавно выпущенного RC версия.Обновление до MVC4 RC: Нет MediaTypeFormatter доступен для чтения объекта типа TestRequestModel из содержимого с типом носителя '' undefined ''
Похоже, что сложные типы запросов привязки модели изменились, но я не могу понять, как/что я делаю неправильно.
Например, у меня есть следующий контроллер 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
, но похоже, что он проверяет заголовки контента (который я должен был), и если он не имеет, что он пытается для получения форматирования из коллекции MediaTypeFormatter
, которую он имеет для определенного типа (который он не может), а затем выбрасывает.
Кто-нибудь еще испытал это? Некоторая глобальная регистрация мне не хватает?
Что такое HTTP-запрос в скрипаче?В частности, что такое значение заголовка «Content-Type»? – Aliostad
Я могу вручную передать 'Content-Type'' application/json', что, интересно, заставляет меня пройти мимо этой ошибки (я пропускал 'application/json' только в заголовке accept). Но теперь сложные типы входят как null, что, по-видимому, имеет общую общую проблему. –
Итак, что же вы тогда «принимаете»? 'Accept: application/json' не работает? Попробуйте использовать '[FromBody]' для параметра. – Aliostad