11

Si un cliente envía datos en un tipo de medio no compatible a un servidor HTTP, el servidor responde con el estado "415 unsupported media type". Pero, ¿cómo decirle al cliente qué tipos de medios son compatibles? ¿Hay una manera estándar o al menos recomendada de hacerlo? ¿O simplemente se escribiría en el cuerpo de la respuesta como texto?Especifique los tipos de medios admitidos al enviar "tipo de medio no compatible 415"

+1

Esperaría un encabezado de respuesta Aceptar, pero Aceptar solo se puede usar para las solicitudes. –

Respuesta

7

No hay ninguna especificación en absoluto para lo que debe hacer en este caso, por lo que esperan para ser puestas en práctica por todo el lugar. (Lo que sería sensato sería si la respuesta del servidor incluye algo así como un encabezado Accept:, ya que tiene la semántica correcta, si actualmente está en la dirección incorrecta.)

+0

Los encabezados de 'Aceptar' del servidor al cliente serían lo que estoy buscando. Estoy esperando HTTP 1.2 ;-) – deamon

0

Creo que puede hacer esto con el verbo Http OPTIONS.

También se puede usar el código de estado de 300 Multiple Choices si su escenario se ajusta a un caso de uso determinado. Si envían una solicitud con un encabezado Accept de application/xml y solo admite text/plain y esa representación reside en una URL distinta, puede responder con un 300 y en el encabezado Ubicación la URL de esa representación. Me doy cuenta de que esto podría no coincidir exactamente con su pregunta, pero es otra opción posible.

Y desde el Spec HTTP:

10.4.7 406 No Aceptable

el recurso identificado por la solicitud es únicamente capaz de generar entidades de respuesta que tienen características de contenido no aceptable de acuerdo con las aceptar cabeceras enviadas en la solicitud.

A menos que fuera una solicitud HEAD, la respuesta DEBERÍA incluir una entidad que contenga una lista de características de entidad disponibles y ubicación (s) de la cual el usuario o agente de usuario puede elegir la más apropiada. El formato de entidad se especifica mediante el tipo de medio proporcionado en el campo de encabezado Content-Type. Dependiendo del formato y las capacidades del agente de usuario, la selección de la opción más adecuada PUEDE realizarse automáticamente. Sin embargo, esta especificación no define ningún estándar para dicha selección automática.

 Note: HTTP/1.1 servers are allowed to return responses which are 
     not acceptable according to the accept headers sent in the 
     request. In some cases, this may even be preferable to sending a 
     406 response. User agents are encouraged to inspect the headers of 
     an incoming response to determine if it is acceptable. 
+0

Eso funcionaría, excepto que no hay especificaciones para el contenido de la respuesta allí. Podría estar diciéndote, pero ¿cómo lo sabrías? –

+0

¿Pero qué encabezado se debe usar para decir qué tipos de medios son compatibles? Este encabezado podría usarse en la respuesta '415' directamente. Por lo general, 'OPTIONS' solo se usa para averiguar qué métodos son compatibles. – deamon

+1

'406' es irrelevante, ya que está relacionado con un tipo de discrepancia para la * respuesta *. '415' es lo que obtienes cuando el servidor no puede manejar el tipo de datos en el cuerpo * request *. (He estado lidiando con esto en el contexto de un servicio web RESTful que estoy desarrollando, así que estoy * seguro * esa es la interpretación correcta.) El problema es que el servidor no puede manejar el mensaje y el cliente está ya lo está enviando; el error es la única posibilidad (y no hay forma de dar una forma legible por máquina adecuada de decir lo que hubiera funcionado). –

-3

En su libro "Manual del desarrollador HTTP" en la página 81 Chris Shiflett explica lo que significa un 415, y luego dice: "El tipo de medio utilizado en el contenido de la respuesta HTTP debe indicarse en el encabezado de la entidad de tipo de contenido".

1) Entonces, ¿el tipo de contenido es una respuesta posible? Presumiblemente sería una lista separada por comas de tipos de contenido aceptados. El problema obvio con esta posibilidad es que Content-Type es un encabezado de entidad, no un encabezado de respuesta.

2) ¿O es esto un error tipográfico en el libro? ¿De verdad quería decir "la solicitud HTTP"?

+1

No, no. "Content-Type" * siempre * identifica el tipo de carga del mensaje, tanto para las solicitudes como para las respuestas (con la excepción de las respuestas HEAD ...). –

0

tl; dr; Editó la clase de proxy generada para heredar de Microsoft.Web.Services3.WebServicesClientProtocol **.

Me encontré con esta pregunta cuando solucioné este error, así que pensé que ayudaría a la siguiente persona que podría venir aquí, aunque no estoy seguro si responde la pregunta tal como se establece. Me encontré con este error cuando en algún momento tuve que tomar el control de una solución existente que utilizaba codificación WSE y MTOM. Era un cliente de Windows que llamaba a un servicio web.

Hasta el punto, el cliente llamaba al servicio web donde arrojaría ese error. Algo que contribuyó a resolver ese error fue verificar la clase proxy del servicio web que aparentemente se genera de forma predeterminada para heredar desde System.Web.Services.Protocols.SoapHttpClientProtocol. Esencialmente eso significaba que en realidad no usaba WSE3.

De todos modos Edité manualmente el proxy y lo cambié para heredar de Microsoft.Web.Services3.WebServicesClientProtocol.

BTW, para ver la clase proxy generada en VS, haga clic en la referencia web y luego haga clic en el botón 'Mostrar todos los archivos' de la barra de herramientas. ¡El archivo reference.cs es un lugar de alegría!

Espero que ayude.

Cuestiones relacionadas