Как поддерживать глагол HTTP OPTIONS в приложении ASP.NET MVC / WebAPI

Я установил веб-приложение ASP.NET, начиная с шаблона MVC 4 / Web API. Кажется, что все работает очень хорошо - никаких проблем, о которых я знаю. Я использовал Chrome и Firefox для просмотра сайта. Я тестировал с использованием Fiddler, и все ответы, кажется, на деньги.

Итак, теперь я перехожу к написанию простого Test.aspx для использования этого нового веб-API. Соответствующие части сценария:

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

Это создает заголовок 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

Как таковой, Web API возвращает метод 405 Not Allowed.

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>

Я понимаю, что глагол OPTIONS по умолчанию не подключен в контроллерах Web API ... Итак, я поместил следующий код в свой UserController.cs:

// OPTIONS http-verb handler
public HttpResponseMessage OptionsUser()
{
    var response = new HttpResponseMessage();
    response.StatusCode = HttpStatusCode.OK;
    return response;
}

... и это устранило ошибку 405 Method Not Allowed, но ответ полностью пустой - данные не возвращаются:

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

Должна быть дополнительная логика ... Я не знаю, как правильно кодировать метод Options или если контроллер является даже подходящим местом для размещения кода. Странно (для меня), что сайт Web API правильно реагирует при просмотре из Firefox или Chrome, но вызов .ajax выше выдает ошибки. Как мне обработать проверку перед полётом в коде .ajax? Может быть, я должен решить эту проблему с помощью логики .ajax на стороне клиента? Или, если это проблема на стороне сервера из-за отсутствия обработки глагола OPTIONS.

Кто-нибудь может помочь? Это, должно быть, очень распространенная проблема, и я прошу прощения, если на нее ответили. Я искал, но не нашел ответов, которые помогли.

ОБНОВИТЬ ИМХО, это проблема на стороне клиента, связанная с приведенным выше кодом Ajax JQuery. Я говорю это, потому что Fiddler не показывает никаких 405 заголовков ошибок, когда я получаю доступ к mywebapidomain / api / user из веб-браузера. Единственное место, где я могу продублировать эту проблему - это вызов JQuery .ajax (). Кроме того, идентичный Ajax-вызов выше работает нормально при запуске на сервере (в том же домене).

Я нашел другой пост:Прототип AJAX-запроса отправляется как ОПЦИИ, а не как GET; приводит к ошибке 501 кажется, что это связано, но я возился с их предложениями, но безуспешно. Очевидно, JQuery закодирован так, что если Ajax-запрос является междоменным (который у меня есть), он добавляет пару заголовков, которые каким-то образом вызывают заголовок OPTIONS.

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

Просто кажется, что должно быть лучшее решение, чем изменение кода ядра в JQuery ...

В приведенном ниже ответе предполагается, что это проблема на стороне сервера. Возможно, я думаю, но я склоняюсь к клиенту, и вызов хостинг-провайдера не поможет.

Ответы на вопрос(10)

Ваш ответ на вопрос