2012-04-02 86 views
15

No estoy del todo seguro de lo que pasó aquí. Puede que haya estropeado las cosas en algún lado, pero no sé qué.ASP.NET Web API - No 'MediaTypeFormatter' está disponible para leer un objeto de tipo 'Int32'

Mi método controlador de API es el siguiente:

public HttpResponseMessage<string> Put(int id) 

He intentado una cadena así con el mismo error.

¿Alguna idea?

Gracias.

Edit: Para ser claros, el id es el parámetro de ruta. El cuerpo de la solicitud es JSON. Si elimino el parámetro de ruta, el método funciona normalmente.

+0

¿Se puede publicar la solicitud sin procesar (de Fiddler o FireBug)? – tpeczek

+1

¿Has eliminado algún formateador predeterminado? ¿Puedes publicar el código de configuración también? – tugberk

+0

¿Qué secciones de configuración quieres? –

Respuesta

6

Lea siguiente entrada en el blog:

Esto se describen los problemas más comunes con el uso de parámetros simples.Sin saber más detalles sobre cómo se ve su solicitud, no es posible determinar a cuál ha accedido.

ACTUALIZACIÓN

Hay otro fallo conocido teniendo en cuenta los valores de ruta. En caso de que no se utilice uno de los formateadores incorporados para la solicitud POST/PUT/PATCH, los parámetros de los valores de ruta no son vinculantes. Para solucionar este la mejor solución es escribir ActionFilterAttribute como se describe a continuación:

+0

Mi problema es específicamente con el parámetro de ruta en sí. Id. Int en la definición de método anterior. –

+0

@RobertoBonini He actualizado la respuesta a un error más conocido relacionado con valores de ruta. – tpeczek

+0

No tenía idea de que era un error, gracias. –

13

Sorprendentemente, int y cadena no tienen un MediaTypeFormatter por defecto, por lo que no sabe cómo manejar esos tipos.

Los únicos tipos que sabe cómo manejarlos de fábrica son JSON, XML y los datos en formato de url. Esta cita es de la página oficial asp.net, http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

En Web API, el tipo de soporte determina la API Web serializa y deserializa el cuerpo del mensaje HTTP. Hay soporte integrado para XML, JSON, y datos de urlencoded de formularios, y puede admitir tipos de medios adicionales escribiendo un formateador de medios.

Ahora usted 'puede' escribir su propia MediaTypeFormatter (el enlace que he proporcionado le mostrará cómo), pero dado que la API web asp.net es todavía en fase beta que he tenido un montón de problemas con él utilizando formateadores personalizados para tipos simples como cadenas. Descubrí que es mucho más fácil simplemente ajustar el valor que desea PONER en xml/json y se deserializará automáticamente. Ver mi post aquí para obtener más información sobre eso, When HTTP-POST has body, url parameter is null

Para su ejemplo específico de su cuerpo PUT se vería así,

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

A continuación, asegúrese de establecer el tipo de contenido de la solicitud HTTP en text/xml (o aplicación/json si elige usar eso). Y debe serializar muy bien en la variable.

+0

Esto se aplicaría si se transmitiera en el cuerpo; mi problema aquí es con el parámetro de ruta en sí mismo - en este caso, id. –

+0

Sí, esto parece ser un error en asp.net web api beta. Cuando tienes un cuerpo en un PUT o POST, el parámetro url será nulo. La única alternativa que puedo ofrecer por el momento es pasar todo en el cuerpo, sin embargo sé que esto puede comprometer su estructura de URL RESTful que es importante. – Despertar

+0

Creo que esta debería ser la respuesta aceptada. La respuesta aceptada actual aborda el problema, pero no tiene la solución. Esta respuesta tiene la solución. –

5

¿Está colocando el valor int en el cuerpo del mensaje de solicitud? Si es así, ¿cuál es el formato?

Si el tipo de contenido es texto, Web API no sabrá qué hacer con él, porque la API web no proporciona un formateador de medios para el texto. Puede escribir un formateador personalizado, como señaló Despertar.

También puede hacer algo como esto:

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

El cuerpo es JSON. Solo necesito que funcione con un parámetro de ruta. Si elimino el parámetro de ruta de la definición del método, funciona. –

0

he publicado una eliminación con un cuerpo JSON y recibieron esto. La publicación con parámetros resolvió el problema.

Cuestiones relacionadas