Manejo de solicitudes de verificación previa de CORS para acciones de ASP.NET MVC

Estoy intentando realizar una solicitud POST entre dominios para una acción del controlador MVC de ASP.NET. Esta acción del controlador acepta y utiliza varios parámetros. El problema es que cuando ocurre la solicitud de verificación previa, la acción del controlador realmente intenta ejecutarse y debido a que la solicitud de OPCIONES no pasa ningún dato, la acción del controlador arroja un error 500 HTTP. Si elimino el código que usa el parámetro, o el parámetro en sí mismo, toda la cadena de solicitud se completa con éxito.

Un ejemplo de cómo se implementa esto:

Controlador de acción

public ActionResult GetData(string data)
{
    return new JsonResult
    {
        Data = data.ToUpper(),
        JsonRequestBehavior = JsonRequestBehavior.AllowGet
    };
}

Código del lado del cliente

<script type="text/javascript">
        $(function () {
            $("#button-request").click(function () {
                var ajaxConfig = {
                    dataType: "json",
                    url: "http://localhost:8100/host/getdata",
                    contentType: 'application/json',
                    data: JSON.stringify({ data: "A string of data" }),
                    type: "POST",
                    success: function (result) {
                        alert(result);
                    },
                    error: function (jqXHR, textStatus, errorThrown) {
                        alert('Error: Status: ' + textStatus + ', Message: ' + errorThrown);
                    }
                };

                $.ajax(ajaxConfig);
            });
        });
    </script>

Ahora, cuando ocurre la solicitud de verificación previa, devuelve un código HTTP 500, porque el parámetro "datos" es nulo, ya que la solicitud de OPCIONES no pasa ningún valor.

La aplicación del servidor se configuró en mi IIS local en el puerto 8100 y la página que ejecuta el código del lado del cliente se configura en el puerto 8200 para imitar las llamadas de varios dominios.

También he configurado el host (en 8100) con los siguientes encabezados:

Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST, GET
Access-Control-Allow-Origin: http://localhost:8200

Una solución que encontré fue verificar el método HTTP que ejecuta la acción y, si se trata de una solicitud de OPCIONES, solo debe devolver el contenido en blanco, de lo contrario, ejecute el código de acción. Al igual que:

public ActionResult GetData(string data)
{
    if (Request.HttpMethod == "OPTIONS") {
        return new ContentResult();
    } else {
        return new JsonResult
        {
            Data = data.ToUpper(),
            JsonRequestBehavior = JsonRequestBehavior.AllowGet
        };
    }
}

Pero este enfoque me parece muy torpe. Consideré agregar este tipo de lógica a unaAttribute, pero incluso esto significaría decorar cada acción que se llamará usando CORS con ella.

¿Existe una solución más elegante para hacer que esta funcionalidad funcione?

Respuestas a la pregunta(6)

Su respuesta a la pregunta