He configurado una aplicación web ASP.NET comenzando con una plantilla MVC 4 / Web API. Parece que las cosas están funcionando muy bien, no hay problemas que yo sepa. He utilizado Chrome y Firefox para recorrer el sitio. Probé con Fiddler y todas las respuestas parecen estar relacionadas con el dinero.
Así que ahora procedo a escribir un Test.aspx simple para consumir esta nueva API web. Las partes relevantes del guión:
<script type="text/javascript">
$(function () {
$.ajax({
url: "http://mywebapidomain.com/api/user",
type: "GET",
contentType: "json",
success: function (data) {
$.each(data, function (index, item) {
....
});
}
);
},
failure: function (result) {
alert(result.d);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("An error occurred, please try again. " + textStatus);
}
});
});
</script>
Esto genera un encabezado REQUEST:
OPTIONS http://host.mywebapidomain.com/api/user HTTP/1.1
Host: host.mywebapidomain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
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
Origin: http://mywebapidomain.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive
Tal como está, Web API devuelve un método 405 no permitido.
HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/xml; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 13:28:12 GMT
Content-Length: 96
<Error><Message>The requested resource does not support http method 'OPTIONS'.</Message></Error>
Entiendo que el verbo OPTIONS no está conectado en los controladores Web API de forma predeterminada ... Entonces, coloqué el siguiente código en mi UserController.cs:
// OPTIONS http-verb handler
public HttpResponseMessage OptionsUser()
{
var response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
return response;
}
... y esto eliminó el error 405 Método no permitido, pero la respuesta está completamente vacía, no se devuelven datos:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 12:56:21 GMT
Content-Length: 0
Debe haber lógica adicional ... No sé cómo codificar correctamente el método de Opciones o si el controlador es el lugar adecuado para poner el código. Es extraño (para mí) que el sitio de la API web responda correctamente cuando se ve desde Firefox o Chrome, sin embargo, la llamada .ajax menciona los errores anteriores. ¿Cómo manejo la verificación "previa al vuelo" en el código .ajax? ¿Quizás debería abordar este problema en la lógica .ajax del lado del cliente? O, si esto es un problema en el lado del servidor debido a no manejar el verbo OPTIONS.
¿Alguien puede ayudar? Este debe ser un problema muy común y me disculpo si se ha respondido aquí. Busqué pero no encontré ninguna respuesta que me ayudara.
ACTUALIZAR En mi humilde opinión, este es un problema del lado del cliente y tiene que ver con el código Ajax JQuery anterior. Digo esto porque Fiddler no muestra ningún encabezado de error 405 cuando accedo a mywebapidomain / api / user desde un navegador web. El único lugar donde puedo duplicar este problema es desde la llamada JQuery .ajax (). Además, la llamada Ajax idéntica anterior funciona bien cuando se ejecuta en el servidor (mismo dominio).
Encontré otra publicación: La solicitud de prototipo AJAX se envía como OPCIONES en lugar de GET; da como resultado un error 501 que parece estar relacionado, pero he modificado sus sugerencias sin éxito. Aparentemente, JQuery está codificado de modo que si una solicitud Ajax es de dominio cruzado (que es la mía), agrega un par de encabezados que activan el encabezado OPTIONS de alguna manera.
'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': Prototype.Version,
Simplemente parece que debería haber una mejor solución disponible que modificar el código central en JQuery ...
La respuesta proporcionada a continuación asume que esto es un problema del lado del servidor. Quizás, supongo, pero me inclino por el cliente y llamar a un proveedor de alojamiento no va a ayudar.