Pregunta

Recientemente estuve haciendo JavaScript entre dominios usando JSONP y ASP.NET MVC.

La acción particular del Controlador solo responderá a una solicitud POST, esto es por diseño.

En IE8, puedo ver (a través de Fiddler2) que la respuesta es correcta y devuelve una respuesta HTTP 200, junto con el javascript JSONP.

En Firefox, Safari y Chrome, la respuesta aún se devuelve, con el código HTTP 200 apropiado y el contenido JSONP, la única diferencia es que el objeto XmlHttpRequest que utiliza JQuery establece el código de estado en 0 y el texto de respuesta en vacío.

Originalmente, pensé que esto se debía a la verificación previa COR HTTP (control de acceso HTTP), por lo que un encabezado personalizado o un tipo de contenido que no sea texto/sin formato provocaría que se enviara una solicitud HTTP adicional (con un verbo de OPCIONES) al servidor.Puedo ver en Fiddler2 que la solicitud de OPCIONES se responde con un HTTP 404.

El servidor web es IIS7 (pero el servidor web de producción será una caja IIS6).En IIS7, puedo ver el OPTIONSVerbHandler estándar listado en los controladores, pero no estoy convencido de que esto realmente esté haciendo algo (de hecho, ni siquiera puedo encontrar ninguna documentación sobre OPTIONSVerbHandler en ninguna parte).

Para solucionar esto, modifiqué la biblioteca JQuery para no configurar el encabezado personalizado y cambié el tipo de contenido a texto/sin formato en lugar de aplicación/json, y Firefox finalmente comienza a omitir la solicitud de OPCIONES y simplemente los PUBLICACIONES simples.

El problema sigue radicando en una respuesta vacía (según el objeto XmlHttpRequest), aunque Fiddler2 muestra que se devuelve una respuesta HTTP 200 exitosa, con contenido.

¿Alguna ayuda?

¿Fue útil?

Solución

Resulta que no puedes usar llamadas entre dominios con JQuery usando POST (lo cual tiene sentido, ya que representa una etiqueta de secuencia de comandos para realizar la llamada).Cambiar a GET solucionó el problema y ahora todo vuelve correctamente.

Tuve que revisar la fuente de JQuery para descubrirlo, pero gracias por la respuesta.

Mate

Otros consejos

Trate de usar firebug en Firefox para ver la solicitud de que se esté enviando. Echa un vistazo a la pestaña de red para ver la solicitud y respuesta HTTP. Tal vez algo está mal configurado? También uso JSONView en Firefox para ver los datos JSON que establece el mimietype applcaiton / JSON. Lamentablemente no maneja JSONP, pero su fin.

Aparte de todos los errores obvios en el lado del cliente, la razón principal de esto es que el motor Gecko busca el Access-Control-Allow-Origin en la cabecera de la servlet. Si no lo encuentra, se abortará la comunicación y obtener un status=0 y statusText=null. Además, el moz-nullprincipal de error de análisis XML. Todo esto es muy engañoso. Todo lo que necesita para resolver este problema es:

response.setHeader("Access-Control-Allow-Origin","*");

En el código servlet y la vida será bueno :-)

En realidad no es el caso. Firefox envía una cabecera OPCIÓN como la siguiente:

Esto es lo que está siendo fijado por el cliente en Firefox:

OPTIONS /MvcApplication/Json/Test1 HTTP/1.1
Host: acoheni580
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://localhost
Access-Control-Request-Method: POST

MVC no sabe cómo manejar esto, ya que sólo está buscando una cabecera de la POST cuando se utiliza el atributo [HttpPost]

Para permitir manualmente la siguiente:

//[HttpPost]
[AcceptVerbs(new string[] {"POST","OPTIONS"})]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top