ASP.NET Web API - Нет "MediaTypeFormatter" доступен для чтения объекта типа "Int32"
Я не совсем уверен, что произошло здесь. Возможно, я что-то испортил, но я не знаю, что.
Мой API-контроллер выглядит следующим образом:
public HttpResponseMessage<string> Put(int id)
Я тоже пробовал строку с той же ошибкой.
Любые идеи?
Спасибо.
Изменить: Чтобы быть ясным - идентификатор является параметром маршрута. Тело запроса - JSON. Если я удалю параметр маршрута, метод будет функционировать как обычно.
Ответы
Ответ 1
Пожалуйста, прочитайте следующее сообщение в блоге:
Это описывает наиболее типичные проблемы с использованием простых параметров. Не зная никаких подробностей о том, как выглядит ваш запрос, невозможно определить, какой из них вы нажали.
UPDATE
Существует еще одна известная ошибка с учетом значений маршрута. Если для запроса POST/PUT/PATCH не используется один из встроенных форматировщиков, параметры параметров маршрута не связываются. Чтобы обойти это, лучшим решением является написать ActionFilterAttribute, как описано ниже:
Ответ 2
Удивительно, что int и string по умолчанию не имеют MediaTypeFormatter, поэтому он не знает, как обращаться с этими типами.
Единственными типами, которые он знает, как обрабатывать из коробки, являются JSON, XML и форма url-кодированные данные. Эта цитата с официального сайта asp.net, http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters
В веб-API тип носителя определяет, как Web API сериализуется и десериализует тело сообщения HTTP. Существует встроенная поддержка XML, JSON, а также данные с формами-urlencoded, и вы можете поддерживать дополнительные медиа типы, написав медиаформат.
Теперь вы можете написать свой собственный MediaTypeFormatter (ссылка, которую я предоставил, покажет вам, как), но поскольку веб-app.net asp.net по-прежнему находится в бета-версии, у меня было много проблем с ним, используя пользовательские форматы для простых типов как строки. Я обнаружил, что гораздо проще просто обернуть любое значение, которое вы хотели бы использовать в xml/json, и оно автоматически получит десериализацию. См. Мой пост здесь для получения дополнительной информации об этом, Когда HTTP-POST имеет тело, параметр url равен null
Для вашего конкретного примера ваше тело PUT будет выглядеть следующим образом:
<message>
<id>6</id>
</message>
Затем не забудьте указать тип содержимого вашего HTTP-запроса в text/xml (или application/json, если вы решите его использовать). И он должен сериализоваться просто отлично в переменной.
Ответ 3
Вы помещаете значение int в тело сообщения запроса? Если да, то какой формат?
Если тип содержимого является текстовым, веб-API не будет знать, что с ним делать, потому что веб-API не предоставляет форматформат для текста. Вы можете написать собственный форматтер, как отметил Despertar.
Вы также можете сделать что-то вроде этого:
public void Put()
{
var s = Request.Content.ReadAsStringAsync().Result;
}
Ответ 4
Я отправил DELETE с помощью json body и получил это. Проводка с параметрами разрешила проблему.