2012-04-02 2 views
15

Я не совсем уверен, что здесь произошло. Возможно, я что-то испортил, но я не знаю, что.ASP.NET Web API - нет «MediaTypeFormatter» доступен для чтения объекта типа «Int32»

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

public HttpResponseMessage<string> Put(int id) 

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

Любые идеи?

Спасибо.

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

+0

Можете ли вы отправить необработанный запрос (от Fiddler или FireBug)? – tpeczek

+1

Удалили ли вы по умолчанию форматиры? Вы также можете опубликовать код конфигурации. – tugberk

+0

Какие разделы конфигурации вы хотите? –

ответ

6

Пожалуйста, прочтите следующие записи:

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

UPDATE

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

+0

Моя проблема связана именно с параметром маршрута. Int id в определении метода выше. –

+0

@RobertoBonini Я обновил ответ на еще одну известную ошибку, которой управляют значения маршрута. – tpeczek

+0

Не думал, что это была ошибка - спасибо. –

13

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

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

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

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

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

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

Тогда не забудьте установить тип содержимого вашего запроса HTTP в тексте/XML (или application/json, если вы решите использовать это). И он должен просто сериализоваться в переменной.

+0

Это применимо, если оно передается в теле - моя проблема здесь связана с самим параметром маршрута - в этом случае - id. –

+0

Да, это похоже на ошибку в asp.net web api beta. Когда у вас есть тело в PUT или POST, параметр url будет null. Единственная альтернатива, которую я могу предложить на данный момент, - это передать все в теле, однако я знаю, что это может скомпрометировать вашу структуру URL-адреса RESTful, которая важна. – Despertar

+0

Я думаю, что это должен быть принятый ответ. Текущий принятый ответ решает проблему, но не имеет решения. У этого ответа есть решение. –

5

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

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

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

public void Put() 
{ 
    var s = Request.Content.ReadAsStringAsync().Result; 
} 
+0

Тело JSON. Мне просто нужно, чтобы он работал с параметром маршрута. Если я удалю параметр маршрута из определения метода, он будет работать. –

0

Я разместил УДАЛИТЬ с JSon телом и получил это. Проводка с параметрами разрешила проблему.

Смежные вопросы