Tengo actualmente un Web API 2 servicio y la necesidad de modificar uno de los métodos para tomar un objeto personalizado como otro parámetro, en la actualidad el método tiene un parámetro que es una simple cadena que viene desde la URL. Después de agregar el objeto personalizado como un parámetro estoy recibiendo ahora un 415 unsupported media type error al llamar al servicio de una .RED de aplicaciones en windows. Curiosamente, yo de éxito se puede llamar a este método con javascript y jquery ajax método.

La Web API 2 método de servicio se parece a esto:

<HttpPost>
<HttpGet>
<Route("{view}")>
Public Function GetResultsWithView(view As String, pPaging As Paging) As HttpResponseMessage
   Dim resp As New HttpResponseMessage
   Dim lstrFetchXml As String = String.Empty
   Dim lstrResults As String = String.Empty

   Try
      '... do some work here to generate xml string for the response
      '//write xml results to response
      resp.Content = New StringContent(lstrResults)
      resp.Content.Headers.ContentType.MediaType = "text/xml"
      resp.Headers.Add("Status-Message", "Query executed successfully")
      resp.StatusCode = HttpStatusCode.OK
   Catch ex As Exception
      resp.StatusCode = HttpStatusCode.InternalServerError
      resp.Headers.Add("Status-Message", String.Format("Error while retrieving results from view {0}: {1}", view, ex.Message))
   End Try
   Return resp
End Function

El método permite tanto POST y GET porque el Paging objeto es opcional. Si yo llamo a este método con un GET solicitud funciona.

Y la simple .NET de código de cliente llamando al servicio de este aspecto:

Dim uri As String = BASE_URI + "fetch/someview"
Dim resp As HttpWebResponse
Dim sr As StreamReader
Dim lstrResponse As String
Dim reqStream As Stream
Dim bytData As Byte()
Dim req As HttpWebRequest = WebRequest.Create(uri)
Dim lstrPagingJSON As String
Dim lPaging As New Paging
Try
   lPaging.Page = 1
   lPaging.Count = 100
   lPaging.PagingCookie = ""
   req.Method = "POST"
   lstrPagingJSON = JsonSerializer(Of Paging)(lPaging)
   bytData = Encoding.UTF8.GetBytes(lstrPagingJSON)
   req.ContentLength = bytData.Length
   reqStream = req.GetRequestStream()
   reqStream.Write(bytData, 0, bytData.Length)
   reqStream.Close()
   req.ContentType = "application/json"

   resp = req.GetResponse()

   sr = New StreamReader(resp.GetResponseStream, Encoding.UTF8)
   lstrResponse = sr.ReadToEnd
   '//do something with the response here
Catch exweb As WebException
   txtOutput.AppendText("Error during request: " + exweb.Message)
Catch ex As Exception
   txtOutput.AppendText(String.Format("General error during request to {0}: {1}", uri, ex.Message))
End Try

El .Cliente de RED se ejecuta en el 4.5 marco y el servicio está en 4.5.2 marco. El error se produce en el resp = req.GetResponse() línea. Algunas cosas que he probado ya:

  • en el cliente, establecer el req.Accept valor a «application/xml» o
    «text/xml»
  • en el método de servicio, elimina la línea
    `resp.Contenido.Los encabezados.ContentType.MediaType = «text/xml»
  • reemplazar el XML de respuesta de los contenidos con algunos estática JSON, trató de descartar cualquier tipo de problemas con el envío de JSON en la solicitud y obtención de datos XML en la respuesta

Hasta ahora sigo recibiendo el mismo 415 respuesta de error no importa lo que yo trato.

He mencionado esto funciona cuando se llama desde javascript, aquí está mi llamada ajax que está trabajando:

$.ajax({
   headers: {},
   url: "api/fetch/someview",
   type: "POST",
   data: "{Count:100,Page:1,PagingCookie:\"\"}",
   contentType: "application/json; charset=utf-8",
   dataType: "xml",
   success: function (data) {
      alert("call succeeded");
   },
   failure: function (response) {
      alert("call failed");
   }
});

En el lado de los servicios, no hay nada de fantasía pasando con la ruta de configuración o cualquier otra cosa, es en casi todos fuera-de-la-caja de Web API 2. Sé que es la ruta de trabajo, las llamadas se enruta correctamente el método, no van a otra parte inesperadamente, así que lo que me estoy perdiendo en el .Cliente de RED? Cualquier ayuda se agradece mucho!

— ACTUALIZACIÓN —

Traté de crear una completamente nueva API de Web service para descartar cualquier posible problema con el servicio existente, he creado un controlador con un único método que toma un objeto personalizado como parámetro. Luego traté de llamar a que a partir de el .Cliente de RED y tiene el mismo error. También he intentado usar el WebClient en lugar de HttpWebRequest, pero sigue apareciendo el mismo error. Esto es algo que también ha trabajado para mí con la API de Web (antes de la API de Web 2).

— ACTUALIZACIÓN —

También he intentado crear una nueva aplicación web utilizando la API de Web 1, cuando me refiero a que con un POST de mi complejo de «parámetros de objeto» ahora se viene en null. Tengo otra web servicio Web API 1 y comprobado que los que todavía se puede llamar éxito con objetos complejos. Sea cual sea mi problema es, que parece ser algo con el JSON que pasa entre el cliente y el servidor. He comprobado el JSON que estoy enviando y su validez, la definición del objeto es también una coincidencia exacta entre el cliente y el servidor para el JSON debe ser capaz de ser interpretado por el servidor.

  • He conseguido esta 415 de error cuando se realiza una eliminación y adición de un JSON de carga donde no era necesario.
InformationsquelleAutor AK3800 | 2016-01-07

4 Comentarios

  1. 49

    RESUELTO

    Después de golpear mi cabeza contra la pared por un par de días con este problema, lo estaba mirando como si el problema tenía algo que ver con el tipo de contenido de la negociación entre el cliente y el servidor. Me cavó más profundo en el que el uso de Fiddler para comprobar los detalles de la solicitud que viene desde la aplicación cliente, aquí está una captura de pantalla de la prima de solicitud como en la captura de fiddler:

    HTTP 415 unsupported media type error al llamar a la API de Web 2 extremo

    Lo que, obviamente, allí falta es el Content-Type encabezado, a pesar de que yo era de la configuración como se ve en el ejemplo de código en mi post original. Pensé que era extraño que el Content-Type nunca llegó a través de a pesar de que yo era de la configuración, por lo que me había otro vistazo a mis otros (de trabajo) código de llamar a una Web diferente a la API del servicio, la única diferencia fue que pasó a ser la configuración de la req.ContentType de la propiedad antes de escribir para el cuerpo de solicitud en ese caso. He hecho el cambio a este nuevo código y que lo hizo, el Content-Type se muestra ahora y me dieron el éxito que se esperaba la respuesta del servicio web. El nuevo código de mi .RED de cliente ahora tiene este aspecto:

    req.Method = "POST"
    req.ContentType = "application/json"
    lstrPagingJSON = JsonSerializer(Of Paging)(lPaging)
    bytData = Encoding.UTF8.GetBytes(lstrPagingJSON)
    req.ContentLength = bytData.Length
    reqStream = req.GetRequestStream()
    reqStream.Write(bytData, 0, bytData.Length)
    reqStream.Close()
    '//Content-Type was being set here, causing the problem
    'req.ContentType = "application/json"

    Eso era todo, el ContentType propiedad sólo necesita ser establecido antes de la escritura a la solicitud de cuerpo

    Creo que este comportamiento es debido a que una vez que el contenido se escribe en el cuerpo que se transmite al extremo de servicio que se llama, el resto de los atributos relativos a la solicitud deben ser establecidos antes de que. Por favor me corrija si estoy equivocado o si se necesita más detalle.

    • ya esta resuelto el problam para mí..gracias
  2. 28

    He experimentado este problema al llamar a mi web api extremo y resuelto.

    En mi caso fue un problema en la forma en que el cliente se codifica el contenido del cuerpo. Yo no era la especificación de la codificación o el tipo de medio. La especificación de ellas resuelto.

    No se especifica el tipo de codificación, causada 415 error:

    var content = new StringContent(postData);
    httpClient.PostAsync(uri, content);

    La especificación de la codificación y el tipo de medio, éxito:

    var content = new StringContent(postData, Encoding.UTF8, "application/json");
    httpClient.PostAsync(uri, content);
    • Son las cadenas mágicas "application/json" disponible como constantes en cualquier lugar de una .NET Core de la biblioteca?
    • hay algunos en el Sistema.Net.Mime espacio de nombres (por ejemplo, del Sistema.Net.Mime.MediaTypeNames.Aplicación.pdf da «application/pdf»), pero la lista no está completa y, para nuestros propósitos aquí, no tiene uno para «application/json», ni es parte del núcleo de la/biblioteca estándar. Consulte stackoverflow.com/questions/10362140/… – alguien tiene muy amablemente creado una lista más completa de las constantes.
  3. 5

    También he experimentado este error.

    Puedo agregar en el encabezado Content-Type: application/json. Tras el cambio, mis presentaciones éxito!

    • Un comentario-en busca de respuesta requiere la edición y no es recomendado.
    • Bueno. Completa de extremo a extremo ejemplo está aquí: stackoverflow.com/a/52003230/984471
    • Yo estaba usando el «Advanced RESTO del Cliente», y esta respuesta me ayudó, a pesar de ser conciso. He añadido el encabezado «Content-Type», y el valor «application/json», reenviado, y funcionó. Tenga en cuenta que el tipo de contenido que probablemente necesita para que coincida con el especificado en el controlador «Produce» atributo (por ejemplo, [Produce(«application/json»)] )
  4. 0

    Yo estaba tratando de escribir un código que funcione en Mac y Windows.
    El código estaba trabajando bien en Windows, pero estaba dando la respuesta como ‘Unsupported Media Type’ en Mac.
    Aquí está el código que he usado y la siguiente línea para que el código funcione en Mac así:

    Request.AddHeader "Content-Type", "application/json"

    Aquí está el fragmento de mi código:

    Dim Client As New WebClient
    Dim Request As New WebRequest
    Dim Response As WebResponse
    Dim Distance As String
    
    Client.BaseUrl = "http://1.1.1.1:8080/config"
    Request.AddHeader "Content-Type", "application/json" *** The line that made the code work on mac
    
    Set Response = Client.Execute(Request)

Dejar respuesta

Please enter your comment!
Please enter your name here