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 и получил это. Проводка с параметрами разрешила проблему.