Obsługa żądań wstępnej weryfikacji CORS do akcji ASP.NET MVC

Usiłuję wykonać żądanie POST między domenami do akcji kontrolera ASP.NET MVC. Ta akcja kontrolera akceptuje i używa różnych parametrów. Problem polega na tym, że kiedy zdarza się żądanie wstępnej inspekcji, akcja kontrolera faktycznie próbuje wykonać i ponieważ żądanie OPTIONS nie przekazuje żadnych danych, akcja kontrolera wyrzuca 500 błędów HTTP. Jeśli usunę kod, który używa parametru lub sam parametr, cały łańcuch żądania zostanie pomyślnie zakończony.

Przykład wdrożenia tego:

Działanie kontrolera

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

Kod po stronie klienta

<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>

Teraz, gdy zdarzy się żądanie wstępnej inspekcji, zwraca kod 500 HTTP, ponieważ parametr „data” ma wartość NULL, ponieważ żądanie OPTIONS nie przekazuje żadnych wartości.

Aplikacja serwera została skonfigurowana w moich lokalnych usługach IIS na porcie 8100, a strona z uruchomionym kodem po stronie klienta jest ustawiona na porcie 8200, aby naśladować połączenia między domenami.

Skonfigurowałem także hosta (na 8100) z następującymi nagłówkami:

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

Jedno obejście, które znalazłem, polegało na sprawdzeniu metody HTTP, która wykonuje akcję i jeśli jest to żądanie OPCJE po prostu zwrócenie pustej zawartości, w przeciwnym razie wykonaj kod akcji. Tak jak:

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

Ale to podejście jest dla mnie bardzo przykre. Rozważałem dodanie tego rodzaju logiki doAttribute, ale nawet to oznaczałoby dekorowanie każdej akcji, która zostanie wywołana za pomocą CORS.

Czy istnieje bardziej eleganckie rozwiązanie, aby ta funkcja działała?

questionAnswers(6)

yourAnswerToTheQuestion