Cómo admitir el verbo OPCIONES HTTP en la aplicación ASP.NET MVC / WebAPI

He configurado una aplicación web ASP.NET comenzando con una plantilla de API MVC 4 / Web. Parece que las cosas están funcionando muy bien, no hay problemas que yo sepa. He usado Chrome y Firefox para recorrer el sitio. He probado utilizando Fiddler y todas las respuestas parecen estar en 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 de SOLICITUD:

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

Como es, la API web 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 OPCIONES no está conectado a los controladores de API web 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 colocar el código. Es extraño (para mí) que el sitio de la API web responda correctamente cuando se ve desde Firefox o Chrome, pero el .ajax llama a los errores anteriores. ¿Cómo manejo la verificación de "verificación previa" en el código .ajax? Tal vez debería estar abordando este problema en la lógica .ajax del lado del cliente? O, si este es un problema en el lado del servidor debido a que no maneja el verbo OPCIONES.

¿Alguien puede ayudar? Este debe ser un problema muy común y pido disculpas si se ha respondido aquí. Busqué pero no encontré ninguna respuesta que 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 a JQuery .ajax (). Además, la llamada Ajax idéntica anterior funciona bien cuando se ejecuta en el servidor (mismo dominio).

Encontré otro post:La solicitud de prototipo AJAX se envía como OPCIONES en lugar de GET; resultados en 501 error Eso parece estar relacionado, pero he jugado con sus sugerencias sin éxito. Aparentemente, JQuery está codificado de modo que si una solicitud Ajax es de dominio cruzado (que es el mío) agrega un par de encabezados que activan el encabezado OPCIONES de alguna manera.

'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': Prototype.Version,

Parece que debería haber una mejor solución disponible que modificar el código del núcleo en JQuery ...

La respuesta proporcionada a continuación asume que este es un problema del lado del servidor. Tal vez, supongo, pero me inclino por el cliente y llamar a un proveedor de hosting no va a ayudar.

Respuestas a la pregunta(10)

Su respuesta a la pregunta