ASP.NET Web API - MediaTypeFormatter недоступен для чтения объекта типа Int32 - PullRequest
16 голосов
/ 02 апреля 2012

Я не совсем уверен, что здесь произошло. Возможно, я где-то все испортил, но не знаю что.

Мой метод контроллера API выглядит следующим образом:

public HttpResponseMessage<string> Put(int id)

Я тоже пробовал строку с той же ошибкой.

Есть идеи?

Спасибо.

Редактировать: Для ясности - идентификатор является параметром маршрута. Тело запроса - JSON. Если я удалю параметр маршрута, метод будет работать как обычно.

Ответы [ 5 ]

13 голосов
/ 03 апреля 2012

Удивительно, но int и string по умолчанию не имеют MediaTypeFormatter, поэтому он не знает, как обрабатывать эти типы.

Единственные типы, которые он умеет обрабатывать «из коробки», - это JSON, XML и данные, закодированные в форме url.Эта цитата взята с официального сайта asp.net: http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

В веб-API тип мультимедиа определяет, как веб-API сериализует и десериализует тело сообщения HTTP.Имеется встроенная поддержка XML, JSON и данных, закодированных в форме, и вы можете поддерживать дополнительные типы носителей, написав средство форматирования носителей.

Теперь вы можете «написать» свой собственный MediaTypeFormatter (ссылка, которую я предоставил, покажет вам, как это сделать), но поскольку веб-интерфейс asp.net все еще находится в бета-версии, у меня возникли большие проблемы с использованием пользовательских средств форматирования для простых типов, таких как строки.Я обнаружил, что гораздо проще просто обернуть любое значение, которое вы хотите поместить в xml / json, и оно будет автоматически десериализовано.См. Мой пост здесь для получения дополнительной информации об этом, Когда HTTP-POST имеет тело, параметр url имеет значение null

Для вашего конкретного примера ваше тело PUT будет выглядеть так:

<message>
   <id>6</id>
</message>

Затем обязательно установите тип содержимого вашего http-запроса на text / xml (или application / json, если вы решите его использовать).И он должен очень точно сериализоваться в переменную.

6 голосов
/ 03 апреля 2012

Пожалуйста, прочитайте следующее сообщение в блоге:

Это описывает наиболее типичные проблемыс использованием простых параметров.Не зная каких-либо подробностей о том, как выглядит ваш запрос, невозможно определить, на какой запрос вы нажали.

ОБНОВЛЕНИЕ

Существует еще одна известная ошибка, связанная со значениями маршрута,В случае, если ни один из встроенных форматеров не используется для запроса POST / PUT / PATCH, параметры значений маршрута не привязываются.Чтобы обойти эту проблему, лучше всего написать ActionFilterAttribute, как описано ниже:

5 голосов
/ 03 апреля 2012

Вы помещаете значение int в тело сообщения запроса? Если да, то в каком формате?

Если тип содержимого - текстовый, веб-API не будет знать, что с ним делать, поскольку веб-API не предоставляет средства форматирования мультимедиа для текста. Как отметил Деспертар, вы можете написать собственный форматтер.

Вы также можете сделать что-то вроде этого:

public void Put()
{
    var s = Request.Content.ReadAsStringAsync().Result;
}
0 голосов
/ 18 апреля 2018

На заметку ... Я видел, как выдается эта ошибка, когда сервису требуется HTTPS.

0 голосов
/ 23 сентября 2014

Я отправил DELETE с телом json и получил это.Размещение с параметрами решило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...