with unsupported type the net failed error json web-services post odata visual-studio-lightswitch

json - the - unsupported media type in vb net



415 tipo de medios no admitidos: servicio POST json a OData en lightswitch 2012 (1)

Recibo el "error 415: tipo de medio no admitido" cuando publico en un servicio OData cuando uso JSON.

Solución al final de este post bastante largo.

Puedo OBTENER utilizando JSON, pero tan pronto como lo intento y POSTE recibo este error.

También puedo obtener / POST usando XML, sin embargo necesito usar json.

Creo que este error se refiere a algo incorrecto en mi encabezado, no al formato json de mi cuerpo de solicitud, que también puede ser incorrecto a continuación, he intentado varias variaciones que resultan en el mismo error.

He estado tratando de depurar usando Fiddler y los siguientes son los resultados.

JSON POST

Solicitud

POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 User-Agent: Fiddler Host: scdb38:8888 Content-Length: 91 Accept: application/json;odata=verbose; Content-Type: application/json; { "d":[ { "Name":"Great White ", "Food":"Surfers" } ] }

Respuesta

HTTP/1.1 415 Unsupported Media Type Cache-Control: private Content-Length: 186 Content-Type: application/json;odata=verbose;charset=utf-8 Server: Microsoft-IIS/7.5 X-Content-Type-Options: nosniff DataServiceVersion: 1.0; X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Wed, 16 Oct 2013 06:20:10 GMT {"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=/"1.0/" encoding=/"utf-16/"?><ExceptionInfo><Message>Unsupported media type requested.</Message></ExceptionInfo>"}}}

JSON GET

Encabezado de solicitud

GET http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 User-Agent: Fiddler Host: scdb38:8888 Content-Length: 0 Accept: application/json;odata=verbose; Content-Type: application/json;

Cabecera de respuesta

HTTP/1.1 200 OK Cache-Control: no-cache Content-Length: 591 Content-Type: application/json;odata=verbose;charset=utf-8 Server: Microsoft-IIS/7.5 X-Content-Type-Options: nosniff DataServiceVersion: 1.0; X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Wed, 16 Oct 2013 06:23:41 GMT {"d":[{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(1)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(1)","etag":"W//"X''00000000000007E4''/"","type":"LightSwitchApplication.Shark"},"Id":1,"RowVersion":"AAAAAAAAB+Q=","Name":"Tiger Shark","Food":"Penguins"},{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(2)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(2)","etag":"W//"X''00000000000007E5''/"","type":"LightSwitchApplication.Shark"},"Id":2,"RowVersion":"AAAAAAAAB+U=","Name":"Grey Nurse","Food":"Lettuce"}]}

No entiendo por qué el tipo de medios no sería compatible con POST cuando GET funciona bien. Me doy cuenta de que estoy usando DataServiceVersion: 1.0 y he buscado actualizaciones, pero estoy usando LightSwitch 2012 y he tenido problemas al hacer referencia a la versión más reciente sin romper la aplicación LightSwitch. Creo que LightSwitch 2013 usa la versión más reciente (?), Pero la actualización para mí abre nuevos desafíos (no técnicos). Siento que estoy dando vueltas en Cirlces y este es mi último recurso y, después de hablar con un colega, mi única otra opción es crear un modelo de datos sobre la base de datos y crear un servicio OData para esto.

---- ACTUALIZACIÓN ----

Desde entonces, he intentado ambas correcciones proporcionadas por Jen S y ahora obtengo Error: 400 Bad Request.

Usando odata = verbose

POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 Accept: application/json;odata=verbose; Content-Type: application/json;odata=verbose; Content-Length: 98 Host: scdb38:8888 { "d":[ { "Name":"Great White ", "Food":"Surfers" } ] } HTTP/1.1 400 Bad Request Cache-Control: private Content-Length: 201 Content-Type: application/json;odata=verbose;charset=utf-8 Server: Microsoft-IIS/7.5 X-Content-Type-Options: nosniff DataServiceVersion: 1.0; X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Wed, 16 Oct 2013 23:31:09 GMT {"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=/"1.0/" encoding=/"utf-16/"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}}

Utilizando DataServiceVersion: 1.0

POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 Accept: application/json;odata=verbose; Content-Type: application/json; Content-Length: 98 Host: scdb38:8888 DataServiceVersion: 1.0; { "d":[ { "Name":"Great White ", "Food":"Surfers" } ] } HTTP/1.1 400 Bad Request Cache-Control: private Content-Length: 201 Content-Type: application/json;odata=verbose;charset=utf-8 Server: Microsoft-IIS/7.5 X-Content-Type-Options: nosniff DataServiceVersion: 1.0; X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Wed, 16 Oct 2013 23:31:09 GMT {"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=/"1.0/" encoding=/"utf-16/"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}}

Utilizando WebServiceVerion: 2.0

POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 Accept: application/json;odata=verbose; Content-Type: application/json; Content-Length: 98 Host: scdb38:8888 DataServiceVersion: 2.0; { "d":[ { "Name":"Great White ", "Food":"Surfers" } ] } HTTP/1.1 400 Bad Request Cache-Control: private Content-Length: 201 Content-Type: application/json;odata=verbose;charset=utf-8 Server: Microsoft-IIS/7.5 X-Content-Type-Options: nosniff DataServiceVersion: 1.0; X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Wed, 16 Oct 2013 23:38:23 GMT {"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=/"1.0/" encoding=/"utf-16/"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}}

¿Estoy progresando con la solución de esto y es solo una cuestión de que el cuerpo de la solicitud json esté estructurado incorrectamente? He intentado algunas infracciones sin éxito, sin embargo, la publicación con XML está funcionando.

----- SOLUCIÓN ------

Gracias a la ayuda de Jen, la publicación utilizando el formato json a un servicio OData está funcionando para mí.

POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1 Accept: application/json;odata=verbose; Content-Type: application/json; Content-Length: 62 Host: scdb38:8888 DataServiceVersion: 1.0; { "Name":"Great White ", "Food":"Surfers" } HTTP/1.1 201 Created Cache-Control: no-cache Content-Length: 298 Content-Type: application/json;odata=verbose;charset=utf-8 ETag: W/"X''00000000000007E7''" Location: http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4) Server: Microsoft-IIS/7.5 X-Content-Type-Options: nosniff DataServiceVersion: 1.0; X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Thu, 17 Oct 2013 23:22:12 GMT {"d":{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4)","etag":"W//"X''00000000000007E7''/"","type":"LightSwitchApplication.Shark"},"Id":4,"RowVersion":"AAAAAAAAB+c=","Name":"Great White ","Food":"Surfers"}}


Parece que este problema tiene que ver con la diferencia entre los Content-Type y Accept . En HTTP, Content-Type se utiliza en las cargas útiles de solicitud y respuesta para transmitir el tipo de medio de la carga útil actual. Accept se utiliza en las cargas útiles de solicitud para indicar qué tipos de medios puede usar el servidor en la carga útil de respuesta.

Por lo tanto, tener un tipo de Content-Type en una solicitud sin un cuerpo (como su solicitud GET) no tiene sentido. Cuando realiza una solicitud POST, está enviando un cuerpo de mensaje, por lo que el tipo de Content-Type sí importa.

Si un servidor no puede procesar el Content-Type de Content-Type de la solicitud, devolverá un error HTTP 415. (Si un servidor no puede satisfacer ninguno de los tipos de medios en el encabezado Accept solicitud, devolverá un error 406).

En OData v3, el tipo de medios "application / json" se interpreta como el nuevo formato JSON ("JSON light"). Si el servidor no admite la lectura de la luz JSON, emitirá un error 415 cuando vea que la solicitud entrante es luz JSON. En su carga útil, el cuerpo de su solicitud es JSON detallado, no JSON light, por lo que el servidor debe poder procesar su solicitud. Simplemente no lo hace porque ve el tipo de contenido ligero JSON.

Puedes arreglar esto de una de dos maneras:

  1. Haga que el tipo de contenido "application / json; odata = verbose" en su solicitud POST, o
  2. Incluya el encabezado DataServiceVersion en la solicitud y establezca que sea menor que v3. Por ejemplo:

    DataServiceVersion: 2.0;

(La opción 2 supone que no está utilizando ninguna función v3 en su carga útil de solicitud).