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:
- Haga que el tipo de contenido "application / json; odata = verbose" en su solicitud POST, o
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).